"围观"设计模式(19)--行为型之观察者模式(Observer Pattern)
2016-06-08 20:08
831 查看
观察者模式是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。----WIKIPEDIA
推的方式
这里的情况是Turtle类明确知道它要通知观察者什么,那么这种方式可以看成是推的方式,但是并不一定都是一定知道对方想要什么,那么这个时候,需要一种拉取得方式,也就是将自身的实例传递给观察者,交由观察者自己去决定获取什么也就是拉取什么。
拉的方式
主要的变更如下:
2. 建立一套触发机制,经过一系列的触发机制,形成触发链。
2. 事件的多级触发。
3. 跨系统的消息交换场景,消息队列的处理机制。
"围观"设计模式(16)--结构型之组合模式(Composite Pattern)
个人理解
观察者模式,就是使得被观察者中持有观察者的对象实例,在发生某些事件的时候,通过notify“通知”观察者,完成相应的操作,他也叫作发布-订阅模式,定义对象间一对多的依赖关系,使得被观察者对象产生动作,即可通知其依赖的对象该被观察者发生了变更。案例解析
正好前几天买了两只巴西龟,以这个为例子,乌龟也时会饿的,他饿了我就要去喂它吃的,这样的话,可以说正好用的到观察者模式。推的方式
public interface Observable { // 添加观察者 public void addObserver(Observer observer); // 删除观察者 public void removeObserver(Observer observer); // 通知观察者 public void notifyObservers(String info); }
public interface Observer { // 喂食 public void feed(String info); }
public class Turtle implements Observable{ private List<Observer> observerList = new ArrayList<Observer>(); public void hungry(){ this.notifyObservers("我饿了!"); } @Override public void addObserver(Observer observer) { observerList.add(observer); } @Override public void removeObserver(Observer observer) { if(observerList != null && observerList.contains(observer)){ observerList.remove(observer); } } @Override public void notifyObservers(String info) { for (Observer observer : observerList) { observer.feed(info); } } }
public class XX implements Observer { @Override public void feed(String info) { System.out.println("喂饲料!"); } }
这里的情况是Turtle类明确知道它要通知观察者什么,那么这种方式可以看成是推的方式,但是并不一定都是一定知道对方想要什么,那么这个时候,需要一种拉取得方式,也就是将自身的实例传递给观察者,交由观察者自己去决定获取什么也就是拉取什么。
拉的方式
主要的变更如下:public class Turtle2 implements Observable2 { private List<Observer2> observerList = new ArrayList<Observer2>(); public void hungry(){ this.notifyObservers(); } @Override public void addObserver(Observer2 observer) { observerList.add(observer); } @Override public void removeObserver(Observer2 observer) { if(observerList != null && observerList.contains(observer)){ observerList.remove(observer); } } @Override public void notifyObservers() { for (Observer2 observer : observerList) { observer.feed(this); } } @Override public boolean isNeedFeed() { return true; } }
观察者模式的优点
1. 观察者与被观察者之间是抽象耦合:扩展被观察者和观察者时较容易。2. 建立一套触发机制,经过一系列的触发机制,形成触发链。
观察者模式的缺点
多级触发的时候,效率让人担忧,在设计的时候要充分的考虑这一点。观察者模式的适用范围
1. 关联行为场景。2. 事件的多级触发。
3. 跨系统的消息交换场景,消息队列的处理机制。
源代码下载
设计模式源代码下载地址推荐阅读
"围观"设计模式(18)--行为型之模板方法模式(TemplateMethod Pattern)"围观"设计模式(16)--结构型之组合模式(Composite Pattern)
相关文章推荐
- valgrind之内存泄漏查找
- C++Primer 中文版 第五版 第七章课后习题答案
- 简单shell学习
- Where与Having的区别
- 跟王老师学反射(二):Java类的加载、连接和初始化
- <<离散数学>>for其实可以非常酷
- LeetCode:Container With Most Water
- 23种设计模式
- 跟王老师学反射(一):反射概述
- CodeForces 24D Broken robot(概率dp+三对角矩阵)
- DELPHI 跨进程获取其他程序的DBGrid内容
- 颜色特征提取
- 打开西部互联网金融市场,玖富选择先笼络创业者们
- Android App 不死之路
- css3中-webkit-text-size-adjust
- Linux简介安装相关
- UVA - 232 Crossword Answers :单纯模拟
- android产品研发(九)-->App网络传输协议
- ubuntu16.04安装谷歌拼音
- Python核心编程