【正文】
一、观察者模式的定义:
简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监听一个主题对象。这样一来,当被观察者状态发生改变时,需要通知相应的观察者,使这些观察者对象能够自动更新。例如:gui中的事件处理机制采用的就是观察者模式。
二、观察者模式的实现:
subject(被观察的对象接口):规定concretesubject的统一接口 ; 每个subject可以有多个observer;
concretesubject(具体被观察对象):维护对所有具体观察者的引用的列表 ;–状态发生变化时会发送通知给所有注册的观察者。
observer(观察者接口):规定concreteobserver的统一接口;定义了一个update()方法,在被观察对象状态改变时会被调用。
concreteobserver(具体观察者):维护一个对concretesubject的引用;特定状态与concretesubject同步; 实现observer接口,update()方法的作用:一旦检测到subject有变动,就更新信息。
图表描述如下:

注:在被观察者类中需要有一个集合维护所有观察者。
三、举例说明:
【方案一】:自己定义接口或者类来实现观察者模式。
步骤如下:
(1)定义被观察者所具有的接口:
(2)定义具体的被观察者:杯子
(3)定义观察者所具有的共同的接口:(更新数据最终当然是在观察者那里进行啦)
(4)定义具体的观察者对象:
(5)测试:
运行后,显示结果如下:
【方案二】:直接调用jdk的api去实现。
(1) 通过继承observable类实现具体的被观察者对象:
(2)通过实现java.util.observer接口实现具体的观察者对象:
(3)测试:
运行后,结果如下:
【工程文件】
密码:hois
四、总结:(观察者模式的作用)
观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表。
由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。如果被观察者和观察者都被扔到一起,那么这个对象必然跨越抽象化和具体化层次。
观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知。