系统解耦(system decoupling)
观察者模式(observer) 【相关文章:Java中的随机数应用】
【扩展阅读:往SQL中导入数据,提示说要备份事务日志】
observer模式解决的是一个相当常见的问题:当某个对象改变状态的时候,另外一组(与之相关的)对象如何更新它们自己。比如说,smalltalk里的“model-view”结构,(它是mvc(model-view-controller)结构的一部分),再比如基本与之相当的“文档-视图(document-view)”结构。假设说你有一些数据(也就是“文档”)与多于一个的视图,比如说是一个图表(plot)与一个文本视图。当你改变数据的时候,这两个视图必须知道进而(根据需要)更新它们自己,这也就是observer模式所要帮你解决的问题。这个问题是如此的常见,以至于它的解决办法已经成了标准java.util库的一部分。 【扩展信息:Java版本名称趣谈】
与其它形式的回调函数(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()的时候浪费时间。this is done before notifying the observers in case the calls to update() do anything that causes a change back to this observable object.
... 下一页