观察者模式(ObserverPattern)。用于实时监测某些Object的动态、只要Object一改变、那么他的所有观察者Observer都会知道、之后观察者会根据Object的改变进行下一步操作。这个在SWING编程中是最常见的。那些Listener就是观察者。
观察者模式角色如下:
抽象主题(Subject)角色:抽象主题角色提供维护一个观察者对象聚集的操作方法,对聚集的增加、删除等。
具体主题(ConcreteSubject)角色:将有关状态存入具体的观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色负责实现抽象主题中聚集的管理方法。
抽象观察者(Observer)角色:为具体观察者提供一个更新接口。
具体观察者(ConcreteObserver)角色:存储与主题相关的自洽状态,实现抽象观察者提供的更新接口。
六大问题:
1、目标与观察者之间的关系
一对多 或者 多对一
2、单向依赖:观察者被动等待目标
3、命名建议:subject observer update
4、触发更新的时机
5、观察者模式的调用顺序示意图:
创建目标 创建观察者 注册观察者
6、通知的顺序
观察者之间是平行通知优先级
两种模型:
1、推模型:update传递目标对象的部分信息
2、拉模型:update传递目标对象本身
优缺点:
1、实现了观察者和目标之间的抽象耦合
2、观察者模式实现了动态联动
3、支持广播通信
4、会引起无谓的操作
何时使用观察者模式:
触发联动
采用java自带的观察者模式:
目标代码:
package com.nudt.design.javaObserver; import java.util.Observable; /** * Created by jeffrey on 15-12-1. */ public class ConcreteWeatherSubject extends Observable { private String weatherContend; public String getWeatherContend() { return weatherContend; } public void setWeatherContend(String weatherContend) { this.weatherContend = weatherContend; this.setChanged(); this.notifyObservers(weatherContend);//推模式 //this.notifyObservers();//拉模式 } }
观察者代码:
package com.nudt.design.javaObserver; import java.util.Observable; import java.util.Observer; /** * Created by jeffrey on 15-12-1. */ public class ConcreteObserver implements Observer { private String observerName; public String getObserverName() { return observerName; } public void setObserverName(String observerName) { this.observerName = observerName; } @Override public void update(Observable observable, Object o) { //推的方式 System.out.println(observerName + "get:"+ o); //拉的方式 //System.out.println(observerName +"get:" + ((ConcreteWeatherSubject)observable).getWeatherContend(); } }
区别对待观察者场景
就是简单的判断语句
原文地址:http://muyunzhe.blog.51cto.com/9164050/1718672