当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。
意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行通知。
应用实例:1、拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。 2、西游记里面悟空请求降服红孩儿,洒了一地水招来一个老乌龟,这个乌龟就是观察者,他观察洒水这个动作。
缺点:1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在的对象中使它们可以各自地改变和复用。
一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。
注意事项:1、JAVA 中已经有了对观察者模式的支持类。 2、避免循环引用。 3、如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式。
观察者模式,我理解的就是观察者订阅被观察者的状态,当被观察者状态改变的时候会通知所有订阅的观察者的过程。所以以下这种写不会更加容易理解一些呢?
Observer 模式的定义:该模式定义了对象之间的一对多依赖关系,Subject 对象是一,Observer 对象是多。当 Subject 对象的状态发生改变时,所有依赖于该 Subject 对象的 Observer 对象都会得到通知,梦见洗头掉头发并且自动更新。
1. Subject 角色是应该定义成类?比如 内置的 java.util.Observable;还是应该定义成接口,以规避Java不支持多重继承的问题?比如《Head First 设计模式》中的推荐作法。
2.应该在什么时候订阅主题(或者说注册观察者)?是实例化观察者对象的同时?比如贴主的示例;还是由客户自主决定?比如此贴的第一篇分享笔记。
4.主题对象通知观察者时,是否携带消息?换句话说,是“推”消息?如贴主示例;还是“拉”消息?
当被观察对象的某个属性发生改变,想让所以与之关联的观察者对象作出响应,就在改变属性的方法中,调用通知方法,所以需要声明一个通知方法,就是遍历所有观察者,调用一个观察者都有的方法,也就是update更新方法。
网友评论 ()条 查看