设计模式应用与发展之观察者模式(java)

 

1     引子

话说上一篇中的门面模式已然跻身云端,而猿人们仍在地面唏嘘……

关于设计模式,有人追捧,有人崇拜,也有人束之高阁;追捧的为模式而模式着,崇拜的始终原地膜拜着,束之高阁的则扮演路人打着酱油。然而,这都不是程序猿人自我进化的正确道路;因知其始,方知其行,而后知其终。

今天继续我们的第三篇探讨:观察者模式之始末。

2     望断天涯路

小时候听老师讲史记,其中有一段说大禹同学受了皇命,抛下尚未圆房的娇妻涂山氏,匆匆赶赴洪灾现场,亲自督促指挥,治理洪患。话说这理科屌丝男还真就是缺筋少弦,十几年下来,三次经过老家都不回去一趟。涂山氏一个大花姑娘的,还没圆房就跑了老公,心里火热着就盼太阳落西山沟啊,就天天的,跑到村口的大石上,踮脚顾盼,望穿秋水。这初恋情,深似海,不想一望就是十几年,花姑娘望成了中年妇女,大禹才回来。恩,据说那块石头现如今成了非著名景点,号:望夫石。

后来,老师又给讲战国了,那时候不是魏打燕,就是齐打楚,最牛逼的就是秦了,见谁打谁。天天的,到处抓壮丁,奔赴了战场,一个个的,死的凄惨,连爹妈都认不出来,马革裹尸就更是奢望了。一到抽丁队来了,便觉风萧萧兮浑身冷冰冰,易水刺骨寒;全村上下哭的稀里哗啦,聚到村口给壮士们送别,这一去兮不复还。

听到悲凉处,真心觉得凄惨,暗叹当世生活还是很美好的,没有那么多生离死别。直到某一天,当我化身程序猿人,调用了另一个猿人的模块接口:

...

// 调用zip工具解压

ZipUtils.unzip("d:/test.zip","d:/test");

System.out.println("解压完成");

...

看得出来,ZipUtils就是另一个猿人写的模块了。

代码很简单,也很容易懂,我立刻有种膜拜的冲动:这简直就是神作啊。

但很不幸,我常常觉得自己就是幽怨的涂山氏,坐在转椅上望穿秋水,期待着“解压完成”能出现在我的视线里;我经常看到的是Stack Trace输出,我的unzip调用就像壮士们出征一样,风萧萧兮不复还。

3     家书抵万金

老师说了,历史的车轮始终是滚滚向前的。

随着社会进步,特别是造纸术发明之后,读书人渐渐多了,人们便也开始矫情起来,会舞文弄墨了。这不烽火连三月,家书抵万金嘛。一张薄纸,却沉甸甸的;当然书中有喜有忧,但至少不是一等十几年,也不再是薛定谔的猫了。

我找到ZipUtils猿人,在夜宵摊上就着酒劲,告诉他我讨厌Stack Trace,我讨厌无力的等待。ZipUtils猿人仰望着星空,若有所思,当夜便高举设计模式大旗,大刀阔斧的进行了改革;终于在一个黑夜过后,他走出了办公室,却迎着朝阳走进了一个新时代:

public classZipUtils extends Observable {

       ...

       // 保存当前正在处理的文件名

       private String currentFileName;

       ...

       // 解压zip文件到指定目录

       public boolean unzip(String zipFile,String unzipDir) {

              ...

              try {

                     // 打开zip文件输入流

                     ZipInputStream zin = newZipInputStream(new FileInputStream(zipFile));

                     // 取zip压缩项

                     ZipEntry entry =zin.getNextEntry();

 

                     while(entry != null) {

                            ...

                            // 设置当前正在处理的文件名

                            currentFileName =entry.getName();

                            // 改变状态

                            this.setChanged();

                            // 通知观察者

                            this.notifyObservers();

                            ...

                     }

                     ...

 

              } catch(…) {

                     ...

                     return false;

              }

 

              return true;

       }

 

       // 保存当前正在处理的文件名

       public String getCurrentFileName() {

              return currentFileName;

       }

 

       ...

}

ZipUtils猿人兴奋的告诉我,他在一宿的闭关中,触摸到了道。

啥?道?我不明白。

我只知道他让我修改我的代码,按照他的指导,我小心翼翼,如履薄冰,修改了我的代码:

public classOhMyGod implements Observer {

       ...

       private ZipUtils zip = new ZipUtils();

       ...

       public void beg() {

              // 添加观察者

              zip.addObserver(this);

              // 解压

              boolean success =zip.unzip("d:/test.zip", "d:/test");

              System.out.println("unzip" + (success ? "success" : "failed"));

       }

 

       public void update(Observable o, Objectarg) {

              // 输出当前被解压的文件名

              System.out.println("unzip:" + ((ZipUtils)o).getCurrentFileName());

       }

 

       …

}

我看着这些被我增加的代码,心里充满了疑惑。这就行了?怎么多了这么多代码?

直到我和ZipUtils猿人恭敬立在屏幕前,看着一行行的信息输出,我长舒了一口气。而从此之后,在我的眼中,ZipUtils猿人也开始浑身泛起金光。

事情还没完,ZipUtils的兴奋仍在持续,他拉着我的小手,跟我说这是一种设计模式的应用,他的名字叫观察者,他不光能展示ZipUtils的运行过程,他还能被多个对象同时观察,云云……

4     网络是原罪

我早已经不再是学生,而社会的进步更是超乎人们的想象,我们已经步入一个信息泛滥的时代。在这个时代,你登录了QQ,你所有的好友都会知道你已经上线。你发了一条微博,所有关注你的人,立刻会收到一条通知。噢,你丢了一个U盘?那么恭喜你,你很快就要出名了。

多年的程序猿人生涯,我接触了更多的模块,更大规模的系统,更复杂的业务逻辑。但我发现,观察者模式依然坚挺适用,只是看上去稍微换了些许模样;甚至更进一步,我们采用了更具规模的各种中间件来实现,比如JMS,比如ActiveMQ……

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值