天天看点

Java设计模式----观察者模式详解

【正文】

一、观察者模式的定义:

简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监听一个主题对象。这样一来,当被观察者状态发生改变时,需要通知相应的观察者,使这些观察者对象能够自动更新。例如:gui中的事件处理机制采用的就是观察者模式。

二、观察者模式的实现:

subject(被观察的对象接口):规定concretesubject的统一接口 ; 每个subject可以有多个observer;

concretesubject(具体被观察对象):维护对所有具体观察者的引用的列表 ;–状态发生变化时会发送通知给所有注册的观察者。

observer(观察者接口):规定concreteobserver的统一接口;定义了一个update()方法,在被观察对象状态改变时会被调用。

concreteobserver(具体观察者):维护一个对concretesubject的引用;特定状态与concretesubject同步; 实现observer接口,update()方法的作用:一旦检测到subject有变动,就更新信息。

图表描述如下:

Java设计模式----观察者模式详解

注:在被观察者类中需要有一个集合维护所有观察者。

三、举例说明:

【方案一】:自己定义接口或者类来实现观察者模式。

步骤如下:

(1)定义被观察者所具有的接口:

Java设计模式----观察者模式详解
Java设计模式----观察者模式详解

(2)定义具体的被观察者:杯子

Java设计模式----观察者模式详解
Java设计模式----观察者模式详解

(3)定义观察者所具有的共同的接口:(更新数据最终当然是在观察者那里进行啦)

(4)定义具体的观察者对象:

Java设计模式----观察者模式详解
Java设计模式----观察者模式详解

(5)测试:

Java设计模式----观察者模式详解
Java设计模式----观察者模式详解

运行后,显示结果如下:

Java设计模式----观察者模式详解

【方案二】:直接调用jdk的api去实现。

(1) 通过继承observable类实现具体的被观察者对象:

Java设计模式----观察者模式详解
Java设计模式----观察者模式详解

(2)通过实现java.util.observer接口实现具体的观察者对象:

Java设计模式----观察者模式详解
Java设计模式----观察者模式详解

(3)测试:

Java设计模式----观察者模式详解
Java设计模式----观察者模式详解

运行后,结果如下:

Java设计模式----观察者模式详解

【工程文件】

密码:hois

四、总结:(观察者模式的作用)

观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表。

        由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。如果被观察者和观察者都被扔到一起,那么这个对象必然跨越抽象化和具体化层次。

观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知。