设计模式学习笔记--观察者模式
来源:互联网 发布:2016网络春晚节目单 编辑:程序博客网 时间:2024/06/01 07:45
二十、观察者模式
观察者模式(observer pattern )用于对象间存在一对多关系时。一个修改对象,可以通知其他依赖对象及时更新。
简介
观察者模式,主要考虑到一个对象的改变通知其他依赖对象,而且要考虑易用和低耦合。
- 优点:观察者和被观察者是抽象耦合的,建立一套触发机制。
- 缺点:若被观察者有很多观察者的话,那么通知起来比较费劲。若观察与被观察之间还有循环依赖的话,可能导致啊系统的循环调用,甚至崩溃。
观察者只能知道有变化,而不知道怎么变化的。
实现
观察者使用三个类Subject、Observer、Client。Subject对象嗲有绑定观察者的方法。需要创建Subject类、Observer抽象类和它的继承实现类。
- 创建Subject类
import java.util.ArrayList;import java.util.List;/** * Created by lenovo on 2016/12/1 0001. * subject 类,包含绑定观察者和通知观察者的方法 */public class Subject { private List<Observer> observers = new ArrayList<>(); private int state; public int getState() { return state; } public void setState(int state) { this.state = state; notifyAllObservers(); } /** * 通知更新所有observer */ private void notifyAllObservers() { for (Observer ob : observers) { ob.update(); } } /** * 绑定observer观察者 * @param observer */ public void attach(Observer observer){ observers.add(observer); }}
- 创建抽象观察者类
/** * Created by lenovo on 2016/12/1 0001. * 抽象的observer观察这类 */public abstract class Observer { protected Subject subject; public abstract void update();}
- 创建实体类
BinaryObserver.java
/** * Created by lenovo on 2016/12/1 0001. * 观察者实体类 */public class BinaryObserver extends Observer { public BinaryObserver(Subject subject) { this.subject = subject; this.subject.attach(this); } /** * 更新状态 */ @Override public void update() { System.out.println("Binary String : " + Integer.toBinaryString(subject.getState())); }}
OctalObserver.java
/** * Created by lenovo on 2016/12/1 0001. * 观察者实体类 */public class OctalObserver extends Observer{ public OctalObserver(Subject subject){ this.subject = subject; this.subject.attach(this); } /** * 更新状态 */ @Override public void update() { System.out.println("Octal String : " + Integer.toOctalString(subject.getState())); }}
HexaObserver.java
/** * Created by lenovo on 2016/12/1 0001. * 观察者实体类 */public class HexaObserver extends Observer { public HexaObserver(Subject subject) { this.subject = subject; this.subject.attach(this); } /** * 更新状态 */ @Override public void update() { System.out.println("Hexa String : " + Integer.toHexString(subject.getState()).toUpperCase()); }}
- 演示
ObserverPatternDemo.java
/** * Created by lenovo on 2016/12/1 0001. * 使用subject和实体类观察者 */public class ObserverPatternDemo { public static void main(String[] args){ Subject subject = new Subject(); new HexaObserver(subject); new OctalObserver(subject); new BinaryObserver(subject); System.out.println("第一次状态改变:state = 15"); subject.setState(15); System.out.println("第二次状态改变:state = 20"); subject.setState(20); }}
- 输出
第一次状态改变:state = 15Hexa String : FOctal String : 17Binary String : 1111第二次状态改变:state = 20Hexa String : 14Octal String : 24Binary String : 10100
0 0
- 观察者设计模式--学习笔记
- 学习笔记 ---- 设计模式之观察者模式
- 设计模式之观察者模式学习笔记
- 设计模式学习笔记之观察者模式
- 设计模式学习笔记-观察者模式
- 设计模式学习笔记-观察者模式
- 设计模式学习笔记--观察者(Observer)模式
- 设计模式---观察者模式(学习笔记)
- 设计模式学习笔记-观察者模式
- 设计模式学习笔记之观察者模式
- 设计模式学习笔记-观察者模式
- 设计模式学习笔记-观察者模式
- 设计模式学习笔记-观察者模式
- 设计模式学习笔记-观察者模式
- 设计模式学习笔记十一:观察者模式
- 设计模式学习笔记-观察者模式
- 设计模式学习笔记--观察者模式
- 设计模式学习笔记-观察者模式
- 第九章 CSS-DOM
- 自适应
- 内部排序算法汇总
- org/apache/commons/collections/map/ListOrderedMap不存在
- [2016/12/1]判断是否存在重复元素 -- c++ set的巧妙用法
- 设计模式学习笔记--观察者模式
- Web Bookmark
- JavaScript 字符串实用常操纪要
- Android studio 从github check out 报错 SDK location not found
- MFC改变控件位置和大小
- C++统计代码运行时间计时器
- Json对象与Json字符串的转化、JSON字符串与Java对象的转换
- APDU常用指令
- java 判断String变量是否为数字