白话设计模式_观察者模式
?????? 好久没搞java了,要找工作了,复习下设计模式~~
??????观察者模式:描述的是一对多的关系,当”一”的状态发生变化时,会通知”多”的一端,前提是”多”个对象必须事先注册到”一”的对象上,让“一”知道它们的存在。
?????? 举个形象的例子:我们平时订阅杂志,每个订阅者(即观察者)必须到杂志社注册个人信息,杂志社为了在日后能够顺利分发杂志,此时必须保存每个订阅者的信息,当杂志社出版新杂志,它就会通过之前那个记录列表一个一个的分别通知它的每一位订阅者,只要你在它那里注册过,就会一直收到新的杂志。当然,你可以选择取消订阅,这样杂志社就不会再向你送新杂志了。只有杂志社一直存在,就会不停的有人订阅杂志或取消订阅,而这个动作是在整个运行机制中动态发生的。
????? 为了松耦合,我们针对接口编程,这是一个主题的接口,声明三个方法,作用分别是注册订阅者、取消订阅、状态变化时通知所有订阅者
public class Main {public static void main(String[] args) {//注册ConcreteSubject subject = new ConcreteSubject();XiaoMing xm = new XiaoMing(subject);DaMing dm = new DaMing(subject);XiaoHong xh = new XiaoHong(subject);//Subject状态发生变化subject.stateChanded("new1", "new2");System.out.println();subject.cancelSub(dm);subject.stateChanded("new3", "new4");}}
?????? 可以看到,订阅者注册到主题之后,主题的状态发生变化(对象中变量被重设)时,会依次通知每个订阅者,而当订阅者取消订阅后,主题的新消息再不再通知它。
???? 总结:
???? 观察者模式的关键在于:一个订阅接口,多个订阅者实现类,主题中以一个集合的形式保存所以订阅者,这样就可以向每个订阅者发送消息
???? 观察者模式的灵活性在于:如果有增加一个订阅者,完全不用修改ConcreteSubject类,直接让新添加的订阅者实现Subscriber接口,并在构造函数中向主题注册,完了就可以直接用了。
1 楼 yekui 2012-09-07 总结的不错。很有借鉴性,谢谢。