设计模式(19)--观察者模式
来源:互联网 发布:地方门户源码带手机版 编辑:程序博客网 时间:2024/05/23 15:05
观察者模式原理很好理解,就是定义一个观察者,一个目标,当目标状态发生改变时,通知观察者,观察者做出相应动作。目标与观察者是一对多的依赖关系。
举个例子:
我们开车,遇到红绿灯,这时候司机就是观察者,目标就是红绿灯,可以有多个司机瞅着一个红绿灯(多对一),比如当前红灯,司机们盯着红绿灯,红绿灯由红灯变绿灯,司机们眼睛瞅到红绿灯变化(得到通知),启动汽车,通过该路口。
观察者模式UML类图:
示例代码:
抽象目标类:
/***** * 抽象目标类 * @author wjw * */public abstract class Subject {protected List<Observer> observes = new ArrayList<Observer>();//添加观察者方法public abstract void addObserver(Observer observer);//删除观察者方法public abstract void deleteObserver(Observer observer);//目标状态发生改变public abstract void changeState();//通知方法(当目标状态发生改变,该方法被调用)public abstract void notifyObserver();}
/***** * 红绿灯目标类 * @author wjw * */public class LampSubject extends Subject{@Overridepublic void addObserver(Observer observer) {// TODO Auto-generated method stubobserves.add(observer);}@Overridepublic void deleteObserver(Observer observer) {// TODO Auto-generated method stubobserves.remove(observer);}@Overridepublic void notifyObserver() {// TODO Auto-generated method stubIterator<Observer> iterator = observes.iterator();while(iterator.hasNext()){Observer observer = iterator.next();observer.change();}}@Overridepublic void changeState() {// TODO Auto-generated method stubSystem.out.println("红灯变绿灯!");System.out.println("--通知老司机--");this.notifyObserver();}}
观察者接口:
/**** * 观察者接口,定义了目标对象发生改变后观察者的改变方法 * @author wjw * */public interface Observer {void change();//观察者接到通知后的动作}
具体观察者1,2(老司机):
/**** * 具体观察者(老司机1) * @author wjw * */public class Driver1Observer implements Observer{@Overridepublic void change() {// TODO Auto-generated method stubSystem.out.println("老司机1看到了红灯变绿灯,一言不合就开车!");}}
/**** * 具体观察者(老司机2) * @author wjw * */public class Driver2Observer implements Observer{@Overridepublic void change() {// TODO Auto-generated method stubSystem.out.println("老司机2看到了红灯变绿灯,二话不说就开车!");}}
Main类:
public class Main {public static void main(String[] args) {//new一个目标对象(红绿灯)Subject subject = new LampSubject();//new两个观察者对象Observer observer1 = new Driver1Observer();//老司机1Observer observer2 = new Driver2Observer();//老司机2//观察者观察目标(将观察者对象添加到目标对象中观察者集合中,表示该对象正在观察)subject.addObserver(observer1);subject.addObserver(observer2);//目标状态变化(红灯变绿灯)subject.changeState();}}
运行结果:
红灯变绿灯!
--通知老司机--
老司机1看到了红灯变绿灯,一言不合就开车!
老司机2看到了红灯变绿灯,二话不说就开车!
通过上面例子应该足够把观察者模式原理说清了
如有错误,欢迎指正
end
阅读全文
0 0
- 设计模式(19)------观察者模式
- 设计模式(19)-观察者模式
- 设计模式(19)--观察者模式
- 设计模式(观察者模式)
- 设计模式,行为模式(观察者模式)
- 设计模式--观察者(监听)设计模式
- 设计模式(一)观察者设计模式
- 设计模式--观察者(监听)设计模式
- 模式设计:观察者模式
- 设计模式-----观察者模式
- 设计模式-观察者模式
- 设计模式--观察者模式
- 设计模式:观察者模式
- 设计模式-----观察者模式
- 设计模式:观察者模式
- 设计模式-观察者模式
- 设计模式 观察者模式
- 设计模式-观察者模式
- POJ 1681 Painter's Problem (高斯消元)
- Android开发实践:屏幕旋转的处理
- CDH:hdfs劵故障
- CFNetwork internal error (0xc01a:/BuildRoot/Library/Caches/com.apple.xbs/Sources/CFNetwork_Sim/CFNet
- Android Activty的加载过程 启动流程 源码分析
- 设计模式(19)--观察者模式
- LeetCode 3Sum Closest C++
- 2015多校第7场 HDU 5373 The shortest problem 规律,暴力
- LaTeX插入多行多列图
- 学习笔记
- android加入谷歌地图(2)
- 根据@把邮箱的用户名和地址分离,以键值对应的方式放入HashMap中
- C++函数模板
- HDU6060 RXD and dividing【DFS】