设计模式之观察者模式
来源:互联网 发布:网络电视需要什么设备 编辑:程序博客网 时间:2024/06/05 04:15
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自己更新自己。
Subject类,抽象通知者,一般用一个抽象类或接口实现。
interface ITongZhiZhe { void addObserver(IObserver observer); void removeObserver(IObserver observer); void notifyObserver(); void setState(String state); String getState();}
Observer类,抽象观察者,一般用一个抽象类或接口实现,在得到通知者通知时更新自己。更新接口通常包含一个update()方法,这个方法叫做更新方法。
interface IObserver { void update();}
ConcreteSubject类,具体通知者,将有关状态存入具体观察者对象;当通知者内部状态改变时,给所有登记过的观察者发出通知。
public class QianTaiTongZhiZhe implements ITongZhiZhe { private List<IObserver> mObservers = new ArrayList<IObserver>(); private String mState; @Override public void addObserver(IObserver observer) { mObservers.add(observer); } @Override public void removeObserver(IObserver observer) { mObservers.remove(observer); } @Override public void notifyObserver() { for (IObserver item : mObservers) { item.update(); } } @Override public void setState(String state) { mState = state; } @Override public String getState() { return mState; }}
ConcreteObserver类,具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与通知者的状态相协调。具体观察者可以保存一个指向具体通知者对象的引用。
public class NBAObserver implements IObserver { private String mName; private ITongZhiZhe mTongzhizhe; public NBAObserver(String name, ITongZhiZhe tongzhizhe) { mName = name; mTongzhizhe = tongzhizhe; } @Override public void update() { System.out.println(mName + mTongzhizhe.getState()); }}
public class StockObserver implements IObserver { private String mName; private ITongZhiZhe mTongzhizhe; public StockObserver(String name, ITongZhiZhe tongzhizhe) { mName = name; mTongzhizhe = tongzhizhe; } @Override public void update() { System.out.println(mName + mTongzhizhe.getState()); }}
调用:
QianTaiTongZhiZhe tongZhiZhe = new QianTaiTongZhiZhe();StockObserver stockObserver = new StockObserver("张三", tongZhiZhe);NBAObserver nbaObserver = new NBAObserver("李四", tongZhiZhe);tongZhiZhe.addObserver(stockObserver);tongZhiZhe.addObserver(nbaObserver);tongZhiZhe.removeObserver(stockObserver);tongZhiZhe.setState("老板来了");tongZhiZhe.notifyObserver();
输出结果:
李四,老板来了
什么时候使用观察者模式:
当一个对象的改变需要同时改变其他对象,而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。
当一个抽象模型有两个方面,其中一方面依赖于另一方面,这时用观察者模式可以将这两者封装在独立的对象中使它们各自独立地改变和复用。
观察者模式所做的工作其实就是在解除耦合。让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。
0 0
- 设计模式之-观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- C++ typedef
- 批量自动替换源码文件中的自动添加内容或者注释 或者其他特殊内容
- Linux学习笔记之网络管理
- LeetCode 104 Maximum Depth of Binary Tree JAVA
- Android 浏览器点击链接打开本地应用(APP)并拿到浏览器传递的数据
- 设计模式之观察者模式
- bzoj1020 安全的航线flight
- Cell嵌套UITableView自动布局
- Metasploit 对 IE 浏览器的极光漏洞进行渗透利用
- 欢迎使用CSDN-markdown编辑器
- tomcat启动报JDWP异常
- position的四个属性值
- Oracle查询数据总数-根据count(主键),在ssh项目中
- C++编程,判断给定序列是否为正确出栈序列