设计模式-观察者设计模式

来源:互联网 发布:伊顿穆勒编程软件 编辑:程序博客网 时间:2024/05/18 09:06

观察者模式

引入:

在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度

记录日志等。对于这一类问题,很接近java设计模式里面的“观察者模式”,它适合解决多种对象跟踪一个对象数据变化的程序结构问题

一、定义

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对 象。这个主题对象在状态上发生变化时, 会通知所有观察者对象,让他们能够自动更新自己 

现实案例:多个男孩暗恋同一个女孩,那么这几个男孩肯定会时刻关注这个女孩,当女孩不开心时,男孩肯定也不开心,当女孩开心时,男孩也开心

二、使用场合

1) 当一个抽象模型,其中一个方面依赖于另一个方面时,把这两者封装到独立的对象中,使其可以独立的改变和复用

2)改变一个对象需要同时改变其他对象,但不知道有多少对象有待于改变

3)一个对象必须通知其它对象,但又不能假定这些对象(也就是说这写对象是不能紧密耦合的),比如数据采集模块,当采集数据以后,必须通知其它对象,但在开发采集模块的时候,事先并不知道其他对象是什么

三、观察者设计模式的组成

1)抽象主题角色(类似于女孩):把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者,一般使用抽象类或者接口来实现

2)具体主题角色:在具体主题内部状态改变时,给所有登陆过的观察者发出通知,具体主题角色通常用一个子类实现

3)抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。 

4)具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使得本身的状态与主题的状态相协调,如果需要,具体观察者角色可以保存一个指向具体主题角色的引用,通常用一个子类实现

四、类图与时序图


五、代码实现

package cn.org.kingdom.observer;import java.util.ArrayList;import java.util.List;//观察者角色interface Observer{void update(Object object);//该方法可以带参数也可以不带}//具体的观察者class ConcreteObserver implements Observer{@Overridepublic void update(Object obj) {System.out.println("receive:"+obj);}}//主题角色interface Subject{public void attach(Observer observer);public void detach(Observer observer);public void notifyObservers(Object obj);}//具体的主题角色class ConcreteSubject implements Subject{private List<Observer> list = new ArrayList<Observer>();@Overridepublic void attach(Observer observer) {list.add(observer);}@Overridepublic void detach(Observer observer) {list.remove(observer);}@Overridepublic void notifyObservers(Object obj) {for (Observer observer : list) {observer.update(obj);}}public void invoke(){for(int i=0;i<10;i++){System.out.println(i);notifyObservers(i);}}}public class ObserverTest {public static void main(String[] args) {ConcreteSubject subject  = new ConcreteSubject();//创建主题对象Observer observer1 = new ConcreteObserver();//创建观察者对象Observer observer2 = new ConcreteObserver();Observer observer3 = new ConcreteObserver();subject.attach(observer1);//加入观察者subject.attach(observer2);subject.attach(observer3);subject.invoke();//调用subject.detach(observer1);subject.detach(observer2);subject.invoke();}}
六、观察者设计模式的好处

观察者模式提供了一种对象设计,让主题和观察者之间耦合度降得很低,为什么呢?关于观察者的一切,主题只知道观察者实现了Observer接口,并不需要观察者具体的类是谁,做了什么或者其他细节.这样的话,由于松耦合,改变主题或者观察者其中一方,并不会影响另一方,只要他们之间的接口仍被遵守,就可以自由地改变它.降低对象之间的耦合度,也是面设对象设计的一个很重要的原则.




原创粉丝点击