楚鸟吧 关注:11贴子:665


IP属地:山西通过百度相册上传1楼2013-10-27 23:18回复
    @ 匿名人士5721


    IP属地:山西2楼2013-10-27 23:19
    回复
      话说小白渐渐熟悉了公司的工作,慢慢地得心应手起来.
      最近这段时间,公司发出去的客户端经常崩溃,但是客户常常描述不清楚崩溃的现象,造成分析困难.为了解决这个问题,项目经理决定加入日志功能,在崩溃后可以让客户提交日志文件以帮助分析.
      这个功能的改造又交到了小白手上.要改造的类是一个相对固定的类,归属于公司的核心类库里面,很多项目都会用到.里面有三个重要方法 request1(),request2(),request3()都要加入日志.
      小白很快就把代码写好了:

      LogRecorder是一个记录日志的工具类.
      小白拿着代码去给经理看,经理摇了摇头:"这个不行,没有可扩展性".
      经理说,这个包是很多项目都有引用到的,但每个项目对日志处理的要求很可能不一样,不能一概而论.具体执行的动作要由具体项目来定义.
      那该怎么做呢?如何在一个类内部执行由外部定义的方法呢?小白陷入了沉思...
      突然他灵机一闪,想到了按钮监听的方法.当按钮按下时执行一个方法,但这个方法却是由外部定义的.那我能不能模仿这种方式呢?
      说干就干.小白很快又写出了新的方法.他首先定义了
      ,然后在类中加入了如下代码:

      这样,通过外部自定义的onRequestListener对象,就可以在类内部执行特定的方法了.
      小白拿着修改后的结果去找经理,经理这次相当满意.
      然后他又提了一个问题:假如我需要让可以执行的方法自由组合呢?比如,一个onRequestListener对象是写本地文件,另一个onRequestListener对象是写数据库.然后我希望同时既写本地文件又写数据库呢?或者,我在程序运行到某个时刻的时候,要动态地添加或者删除一个动作呢?
      重新组合一个类?小白很快就否定了这种方案.两个可以组合,但如果有三个,四个,二十个呢?那有多少种组合方式,要新增多少类?
      很快,他又想出了办法.我不保存单一的onRequestListener对象,而是保存一个对象集合,那不就好了?
      新的代码很快就敲出来了:

      这回,经理完全满意了.
      这就是监听者模式.经理说.
      通过这种模式,可以为类附加上多个监听对象.当被监听对象的状态变化或者执行某个动作时(request1()),被监听对象通知监听者们(notifyOnRequest1()),以执行它们各自相应的动作.在相对封闭或固定的类内部,需要监控它的状态或者让它额外执行某些动作时,常常可以使用这种模式.


      IP属地:山西3楼2013-10-27 23:20
      回复
        监听者模式的优点,在于在不改动监听对象的情况下,可以随着监听对象状态的变化执行某个动作. 这个动作在某种意义上对该对象的使用者是隐藏的. 仿佛当你身中含笑半步颠之后,你不知道自己的下一步迈出去后会是什么后果,骚年,怕了有木有?


        IP属地:山西4楼2013-10-27 23:25
        回复









          IP属地:山西6楼2013-10-27 23:26
          回复
            swing程序 main开始
            web程序 web.xml开始
            断掉调试等(看源码)


            IP属地:山西7楼2013-10-27 23:29
            回复
              设计模式这个东西,很多新人可能就看个概念,了解不是很深.使用过程中也没感觉有什么用,甚至就觉得"还不如我简单几行实现来的方便"
              按我的理解来说,设计模式本来就不是为了解决那些"几行代码能实现"的问题的.设计模式一般是对复杂代码逻辑的抽象,是保持复杂逻辑低耦合,高拓展和较高的易读性的一种方式的总结.
              说实话,一般在校的培训的,或者刚工作的,大概都不怎么会意识到这东西的重要性吧....
              但是工作到后面,面对的逻辑复杂起来了,面对客户和领导提出各种各样稀奇古怪的要求时,猛的你会发现,这玩意挺有用的...
              后来我觉得,如果我当时刚上路时,有人给我说这些东西,让我形成一些意识,我大概会少走一些弯路吧.
              所以这几篇东西纯面向新人的,就是按我的理解做个普及.当然由于本人水平所限,难免会有很多疏漏,大神们多包涵了


              IP属地:山西8楼2013-10-27 23:33
              回复
                北冥神功:可以吸取他人的内力以供己用.....本派武功,以积蓄内力为第一要义。内力既厚,天下武功无不为我所用,犹之北冥,大舟小舟无不载,大鱼小鱼无不容。
                ——阿基米德


                IP属地:山西9楼2013-10-27 23:33
                回复
                  小白来到一家新公司,很兴奋地开始了自己作为JAVA程序猿的开(ku)心(bi)之旅.
                  没两天,小白就接到了第一个需求.
                  需求很简单.公司和建设银行合作了一个项目,有个功能要求显示款项的信息.公司同时给来了接口文档,里面提供了建行提供的jar的调用方法:CcbService.getAmount()(渣命名,大家先凑合着看...).
                  小白很快就写出了查询方法:

                  两个月过去了,小白又接到了新的需求.原先的项目受到建设银行好评,现在工商银行也要引入.按照公司的要求,工商银行也提供了一个查询的接口方法IcbcService.getAmount().
                  小白犯愁了:我该怎么改造原先的方法呢?
                  按照培训教过的思路,这时候应该抽象出接口BankService,让两个类分别实现其中的getAmount()方法.但是这两个类都是被封装在各自的jar里,小白不可能去改造它的结构.如果另外写个方法实现,那在调用时还得不断判断款项来源来确定要调用的方法....小白想想就觉得头疼.
                  有问题就问是个好习惯.小白去请教前辈,前辈指点了他一条明路:可以使用适配器模式.适配器模式可以不同的实例包裹在一个统一的类对象中,以兼容不同的接口.
                  小白很快就把改造的工作做好了.首先,他定义了一个通用接口--BankAdapter:

                  然后改造了查询的方法,使用新的接口类作为参数:

                  然后分别定义了两个类,继承自接口类:

                  这样,只要传入不同的adapter对象给调用方法就可以了.
                  又过了一段时间,光大银行也被公司拿下了.这次他们甚至不直接提供接口类,而是要通过访问一个远程地址"http://xxx.xx/xx"来获得.
                  本来颇有难度的适配问题,小白这回解决起来得心应手:

                  小白笑了:本来很麻烦的适配问题,通过适配器模式解决起来,就是so easy


                  IP属地:山西10楼2013-10-27 23:34
                  回复
                    适配器模式,它可以把来自不同实例的方法统一成相同的接口,然后统一对外提供.犹如北冥神功,它吸尽天下各门各派的内力,却能转化为统一的逍遥派内力,使得使用者在使用内力时不用关注内力性质到底是什么.
                    适配器其实也有用到接口(BankAdapter),不过它是用另一个类来包含提供的类实例,不是单纯的"接口--实现"的模式.
                    单纯接口不适用的原因在贴里说了. CcbService 和 IcbcService两个类是甲方提供的,打包在jar里过来的.他们不可能为了我们一个项目去改动类结构的.实际项目中,这种情况非常常见.
                    问题是在于,CcbService 和 IcbcService不是我们自己写的,而是由不同的甲方提供的.....不知道这么说你会不会明白
                    我这里为了描述方便,起了类似的名字.但实际情况下很可能不是这样. 比如建行的,获取它的金额的接口可能是 AmountMananger.getItem().amount, 工商行的可能是 AnalyseServiceWrapper.getValue(AMOUNT) 之类的....通过接口去统一只能是很理想的情况.


                    IP属地:山西11楼2013-10-27 23:35
                    回复
                      只提供一个实例对象在某些情况下的作用是很大的.例如保证对象的一致性,通过复用资源节省创建的时间和占用空间等等.另外在一些需要长期频繁使用,但又不经常变化的对象,例如配置读取等情境下,单例模式也有很好的应用.
                      就像倚天剑一般是一个独一无二的存在.江湖中人不管怎么争夺,获取的都是同一把.


                      IP属地:山西13楼2013-10-27 23:36
                      回复


                        IP属地:山西通过百度相册上传14楼2013-10-28 01:07
                        回复
                          观察者和监听者模式一般是认为注入的监听方法的调用方不同.
                          一般来说,监听方法的调用在观察者模式中,对被观察者是隐藏的,而要由外部去主动调用.举个例子,android中适配器同时也使用了观察者模式,当数据变化的时候需要外部手动调用notifydatasetchanged()以通知UI更新.
                          在监听者模式中,监听方法的调用在被观察者内部产生,对外部是隐藏的.具体可见各种按钮事件等,我们从来不会主动在外部自己来调用onkeypressed()神马的.
                          不知道这么解释楼上的会不会理解...
                          比如帖子里的项目情况,如果notifyRequest1()不由request1()方法调用,而是每次外部调用request1()的时候,手动调用,那整个味道就变了,就成了观察者模式.
                          我知道有些地方可能把两种模式称为是同一种,包括最初教材上也只有观察者,没有监听者模式.可是在我学习和使用的过程中,我觉得两种区别还是很大的,不适合混为一谈.
                          观察者的优势在于监听方法调用时机可控.回到我比较熟悉的安卓领域,UI更新是相对比较耗资源的,而一次方法执行中可能数据会变很多次,UI完全可以等结果确定完后再行更新,那使用观察者模式会比较适合.
                          而帖子里的情况明显就比较适合监听者模式.外部调用时未必每次都会记得手动调用一次日志记录,或者有可能你这个日志只是想在后台自己偷偷记录,不想暴露给外部.那监听者实时的优势就很明显了.
                          这篇看来是楼主渣表述....
                          首先,有一个被监听的对象A.
                          我们希望在A对象在一些固定的时机(比如状态变化,比如创建/销毁,比如执行了某些方法)跟随执行一些其他的动作,而这些动作不由事先定义,那就可以由A对象持有一些监听对象,在相应时机执行这些监听对象相应的方法.
                          这些方法由于是在被监听对象内部固定的时机被调用的,因此对于对象的使用者来说基本是完全隐藏的,你也不用去关心到底做了什么.
                          这种模式主要的优点在于,监听方法一定会严格按照定义的时机来执行,也不会执行错(例如调用了request2不可能会打印出request1的日志),所以一般在打印监控日志神马的场合应用比较多.


                          IP属地:山西15楼2013-10-28 01:09
                          回复


                            16楼2013-10-28 02:03
                            收起回复
                              @ cysqll(榜样)
                              入职已经1年了,回头看看,感觉自己和未出校门前变化了,太多太多,经历了很多事情,有舍有得,渐渐的,不知不觉地感觉自己变了,变得成熟,变得坚强,变得开朗,变得胖了。。。
                              两年前,我还在学校里和室友扯淡聊天,没事学学网管,写写论文。。。
                              一年前,我经历了半年左右时间的培训学习什么的,付出过,也收获过,终于踏入了工作的苦海。。。
                              今年,我已经工作了1年了,有过开心,有过悲伤,有过迷茫,有过肯定,路是自己一步步走出来的,未来的道路我们看不见,但是,我们会自己走下去,坚定的走下去!
                              有时候,我会像今天早上一样问自己,曾经的梦想你放弃了没有。。。我不知道,但是看着曾经的笔记,我突然发现自己已经在过去的某一个时间段上,放弃了自己,但是,我想现在重新开始,一切都不晚,重要的是,从现在开始去做、去学、去锻炼。
                              说真的,很累,但是很充实,《中国合伙人》里的主人公之所以成功,不是在于他们下海了,也不是在于他们去过美国,而是在于,想了那就去做,管他是自己想的还是被人逼的,不去尝试,不去学习,不去做,机会来了,你拿什么去准备,就像是写项目,你没有底蕴,没有内涵,没有好的设计,谁会把项目送给你,就算送,能送你一辈子么?
                              最后借用马云的话,“你生来就不是豪门,没有王子公主的命 就别学只有王子公主才能得的病,人家有时间、金钱去仰望天空、去抑郁彷徨,你没有,你必须奋斗,你生来就背负着家 庭、生活的重担!别把时间都浪费在埋怨、牢骚上,没有人对不起你;别把自己看得跟故事里的男女主角似的,人家天生漂亮、天性善良,你呢,你能够给自己的优势就是能力,然而,如果你一味的颓废,就连这最后的机会都会丧失,成为一无是处的废物!爱自己的最好方式就是努力奋斗让自己优秀起来,如果你再颓废,别郁闷没有知己、试问,你有什么值得爱,你配吗?” 往往一个人在乎的 不是金钱而是一颗奋斗的心!
                              将来的你,一定会感谢现在拼命努力的你!I


                              IP属地:山西18楼2013-11-02 20:19
                              收起回复