读书笔记之观察者模式
2017-02-22 18:05
239 查看
观察者模式主要有以下三点特点:
一.主体对象管理者某些数据,当这些数据一旦发生改变就会通知观察者,如果观察者对象已经订阅主题就会得到实时的数据更新,而非观察者对象不会。
二.观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象收到改变时,他的所有依赖者都会通知并自动更新
三.主题是真正拥有数据的人,观察者是主题的依赖者,在变化数据时更新,这比很多对象同时控制同一份数据,可以得到更干净的oo设计
综上所述,我们可以总结观察者模式的组成:
#抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
#具体主题角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知,具体主题角色通常用一个子类实现。
#抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题的更新时通知自己
#具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调,通常用一个子类实现,具体观察者角色可以保存一个志向具体主题的引用。
(在此之前说一点小知识,也不知道理解的对不对,有利于观察者模式的理解
假设有一个抽象类animal,有两个具体的实现dog与cat。
针对实现编程: Dog dog = new Dog(); dog.bark(); 声明状态d为dog类型,会造成我们必须针对具体实现代码
针对接口编程: Animal a = new Dog(); a.bark(); 我们知道该对象是狗,但是我们现在利用animal进行多态的调用)
优点:观察者模式解除了主题和观察者的耦合,让耦合的双方都依赖于抽象而不是依赖于具体的实现,从而各自的变化都不会影响到另一方的变化
缺点:依赖关系并未完全解除,抽象主题依旧依赖抽象观察者
适用场景:当一个对象需要改变而需要改变其它对象时,却不知道有多少个对象待改变
本文参考了
:http://www.cnblogs.com/mengdd/archive/2013/02/07/2908929.html
感谢作者圣骑士Wind对知识的分享
一.主体对象管理者某些数据,当这些数据一旦发生改变就会通知观察者,如果观察者对象已经订阅主题就会得到实时的数据更新,而非观察者对象不会。
二.观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象收到改变时,他的所有依赖者都会通知并自动更新
三.主题是真正拥有数据的人,观察者是主题的依赖者,在变化数据时更新,这比很多对象同时控制同一份数据,可以得到更干净的oo设计
综上所述,我们可以总结观察者模式的组成:
#抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
#具体主题角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知,具体主题角色通常用一个子类实现。
#抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题的更新时通知自己
#具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调,通常用一个子类实现,具体观察者角色可以保存一个志向具体主题的引用。
(在此之前说一点小知识,也不知道理解的对不对,有利于观察者模式的理解
假设有一个抽象类animal,有两个具体的实现dog与cat。
针对实现编程: Dog dog = new Dog(); dog.bark(); 声明状态d为dog类型,会造成我们必须针对具体实现代码
针对接口编程: Animal a = new Dog(); a.bark(); 我们知道该对象是狗,但是我们现在利用animal进行多态的调用)
//抽象主题角色,被观察 public interface Subject{ public void addWatcher(Watcher watcher); public void removeWatcher(Watcher watcher); public void notifyWatcher(String str); } //具体主题角色 public ConcretedSubject implements Subject{ //记录存放观察者 private List<Watcher> list = new ArrayList<>(); @override public void addWatcher(Watcher watcher) { list.add(watcher);//注册观测者 } @Override public void removeWatcher(Watcher watcher) { list.remove(watcher);//移除观测者 } @Override public void notifyWatchers(String str) { // 在这里,我们把状态告诉每一个观察者,因为观察者都实现了update,所以我们知道如何通知他们 for (int i=0;i<list.size();i++) { Watcher watcher = (Watcher)list.get(i); watcher.update(str); } } } //抽象观察者角色 public interface Watcher{ public void update(String str); } //具体观察者角色 public ConcretedWatcher implements Watcher{ @override public void update(String str){ System.out.println(str); } } 编写测试类 public class Test { public static void main(String[] args) { Watched girl = new ConcreteWatched();//实例化一个具体主题角色 Watcher watcher1 = new ConcreteWatcher();//实例化一个具体观察者角色 Watcher watcher2 = new ConcreteWatcher(); Watcher watcher3 = new ConcreteWatcher(); girl.addWatcher(watcher1);//存放观察者 girl.addWatcher(watcher2); girl.addWatcher(watcher3); girl.removeWatcher(watcher3);//同时也可以移除观察者3 girl.notifyWatchers("开心");//主题通过该方法调用观察者的update方法通知所有的观察者主题状态改变了 } }
优点:观察者模式解除了主题和观察者的耦合,让耦合的双方都依赖于抽象而不是依赖于具体的实现,从而各自的变化都不会影响到另一方的变化
缺点:依赖关系并未完全解除,抽象主题依旧依赖抽象观察者
适用场景:当一个对象需要改变而需要改变其它对象时,却不知道有多少个对象待改变
本文参考了
:http://www.cnblogs.com/mengdd/archive/2013/02/07/2908929.html
感谢作者圣骑士Wind对知识的分享
相关文章推荐
- 《深入浅出设计模式-中文版》读书笔记-观察者模式(四)
- 读书笔记12:观察者模式
- 读书笔记_java设计模式深入研究 第五章 观察者模式 Observer
- 9.java设计模式(读书笔记)观察者模式
- 《Android源码设计模式》读书笔记 (12) 第12章 观察者模式
- 《大话设计模式》读书笔记-观察者模式
- 《Android源码设计模式解析与实战》读书笔记(十二)——观察者模式
- 读书笔记之 - javascript 设计模式 - 观察者模式
- head first 读书笔记:观察者模式(openfire 消息通知 demo)
- 《HeadFirst设计模式》读书笔记-第2章-观察者模式
- 读书笔记12:观察者模式
- 《Head First设计模式》 读书笔记02 观察者模式 Observer
- 《Head First设计模式》读书笔记之观察者模式
- 《Head First Design Patterns》读书笔记之观察者模式
- 读书笔记2:Head First设计模式——观察者模式
- 【读书笔记】观察者模式第一版C#_C++
- 【读书笔记-重构与模式】 观察者模式--将客户元素从主体中分离
- 对象主题设计模式读书笔记-----观察者模式
- 读书笔记12:观察者模式
- HeadFirst设计模式_读书笔记_002_观察者模式