当前位置:首页 » 编程博文
开发技术指南» 文章正文
    引言: 系统解耦(System decoupling) 观察者模式(Observer) 和其它形式的回调函数(callback)类似,Observer模式也允许你通过挂钩程序(hook point)改变代码。
 

 

 ·我的jasperreport的具体用法    »显示摘要«
    摘要:我的系统:jsp+strtus+ejb+dao+db我的思路:在action(ro dispatchaction)组装好报表所需的参数,然后传递给统一的显示servlet我的实现1.显示servlet2.参数class3.action1.显示servlet(此处为html)public class jrhtmlservlet extends httpservlet { /** * */ publi......
    摘要: 2003-08-23 第0章 写在前面 初译稿已经尘埃落定,目前正在审校,不日即可发表。首先写了译序,并把所有的目录整理了出来,让各位先睹为快吧! 第1章 连接和加载 正在翻译中,不日即可完工…… ......


翻译TIPatterns--系统解耦(System decoupling)

系统解耦(system decoupling)

观察者模式(observer) 【程序编程相关:前车之鉴-ASSERT带来的奇怪错误1

  【推荐阅读:前车之鉴--使用ASSERT可能会给你带

    observer模式解决的是一个相当常见的问题:当某个对象改变状态的时候,另外一组(与之相关的)对象如何更新它们自己.比如说,smalltalk里的“model-view”结构,(它是mvc(model-view-controller)结构的一部分),再比如基本与之相当的“文档-视图(document-view)”结构.假设说你有一些数据(也就是“文档”)与多于一个的视图,比如说是一个图表(plot)与一个文本视图.当你改变数据的时候,这两个视图必须知道进而(根据需要)更新它们自己,这也就是observer模式所要帮你解决的问题.这个问题是如此的常见,以至于它的解决办法已经成了标准java.util库的一部分. 【扩展信息:Design Smells And OO

    与其它形式的回调函数(callback)类似,observer模式也允许你通过挂钩程序(hook point)改变代码.不同之处在于,从本质上说,observer模式是完全动态的.它经常被用于需要根据其它对象的状态变化来改变自身(状态)的场合,而且它还经常是事件管理系统(event management)的基本组成部分.无论什么时候,当你需要用完全动态的方式分离呼叫源与被呼叫代码的时候,(observer模式都是你的首选).(最后一句话好像没写完?)

    用java实现observer模式需要用到两种类型的对象,observable类负责记住发生变化时需要通知哪些类,而不论“状态”改变与否.当被观察对象说“ok,你们(指观察者)可以根据需要更新你们自己了,”observable类通过调用notifyobservers()方法通知列表上的每个观察者,进而完成这个任务.notifyobservers()是基类observable的一个方法.

    实际上,observer模式真正变化的有两样东西:观察者(observing objects)的数量与它们如何更新自己.也就是说,observer模式使得你在不必改动其它代码的情况下只针对这两种变化更改代码.

......(作者还没写完?)

    observer实际上是只有一个成员函数的接口类,这个成员函数就是update().当被观察者决定更新所有的观察者的时候,它就调用update()函数.是否需要传递参数是可选的;即使是没有参数的update()函数也同样符合observer模式;但是,更通常的做法是让被观察者(通过update()函数)把引起更新的对象(也就是它自己? )与其它有用的信息传递给观察者, 因为一个观察者可能会注册到多于一个的被观察者 .这样,观察者对象就不用再费劲查找是哪个被观察者引起的更新,并且它所需要的信息也已经传递过来.

    决定何时以及如何发起更新(updating)的那个“被观察者对象”被命名为observable.

    observable类用一个标志(flag)来指示它自己是否改变.对于比较简单的设计来说,不用flag也是可以的;如果有变化,就通知所有的观察者.如果用flag的话,你可以使通知的时间延迟,并且由你来决定只在合适的时候通知观察者.但是,请注意,控制flag状态的方法是受保护的(protected),也就是说,只有(observable类的)派生类可以决定哪些东西可以构成一个变化(constitues a change),而不是由observer派生类的最终用户来决定.

    大多数工作是在notifyobservers()这个方法里完成的.如果没有将flag置为“已改变”,那notifyobservers()什么也不做;否则,它先清除flag的“已改变”状态,从而避免重复调用notifyobservers()的时候浪费时间.
...   下一页

 ·有趣的linux入门文章    »显示摘要«
    摘要:你从来只用过windows,从来没接触过unix,只知道把一个文件拽来拽去,只知道硬盘就是c: d: e:却从来没有研究过分区表,也许会用vc编个程序,很习惯它的集成环境....有一天,不管什么原因了,也许是看报纸上那些把内存和硬盘都分不清楚的记者的吹嘘,或者是老板要求你用它作个项目,或者是同学们都有了你没有觉得很土,或者你听说找工作有这个的经验就有更大希望....不管怎样,你想在自己的机器上安装......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE