设计模式-观察者模式
来源:互联网 发布:贴吧人肉软件 编辑:程序博客网 时间:2024/06/08 05:20
观察者模式
what(是什么)
当一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。列如: 拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。
why(为什么用它)
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。
缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
how(怎么用)
使用面向对象技术,可以将这种依赖关系弱化。
package observable;import java.util.Observable;/** * 被观察者 * */public class House extends Observable { private float price; public House(float price) { super(); this.price = price; } public float getPrice() { return price; } public void setPrice(float price) { super.setChanged();// 设置变化点 super.notifyObservers(price);// 通知所有观察者价格改变 this.price = price; } @Override public String toString() { return "House [price=" + price + "]"; }}package observable;import java.util.Observable;import java.util.Observer;/** * 观察者 * */public class HousePriceObserver implements Observer{ private String name; public HousePriceObserver(String name) { super(); this.name = name; } @Override public void update(Observable o, Object arg) { if(arg instanceof Float){ System.out.println(this.name+"观察到价格更改为:"); System.out.println(arg); } }}package observable;public class Demo { public static void main(String[] args) { House h = new House(100000000); HousePriceObserver hp1 = new HousePriceObserver("购房者A"); HousePriceObserver hp2 = new HousePriceObserver("购房者2"); h.addObserver(hp1); h.addObserver(hp2); System.out.println(h); h.setPrice(6666666); System.out.println(h); }}
结果:
House [price=1.0E8]
购房者2观察到价格更改为:
6666666.0
购房者A观察到价格更改为:
6666666.0
House [price=6666666.0]
注意事项: 1、JAVA 中已经有了对观察者模式的支持类。 2、避免循环引用。 3、如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式。
阅读全文
0 0
- 模式设计:观察者模式
- 设计模式-----观察者模式
- 设计模式-观察者模式
- 设计模式--观察者模式
- 设计模式:观察者模式
- 设计模式-----观察者模式
- 设计模式:观察者模式
- 设计模式-观察者模式
- 设计模式 观察者模式
- 设计模式-观察者模式
- 设计模式-【观察者模式】
- 设计模式-观察者模式
- 设计模式 -- 观察者模式
- 设计模式-观察者模式
- 【设计模式】观察者模式
- 设计模式- 观察者模式
- 设计模式- 观察者模式
- 设计模式--观察者模式
- Eclipse中建立struts2的配置文件struts.xml
- Eclipse下使用maven搭建多模块项目
- vs2015运行c++出现的小问题及解决方案(希望能帮助一些和我一样的新手)
- NP理论(2):“判定问题”与“停机问题” 精选 已有 2924 次阅读 2016-7-18 23:20 |个人分类:NP理论|系统分类:科研笔记|关键词:判定问题 停机问题 计算机理论中现在流行
- springMVC一对一500错误
- 设计模式-观察者模式
- 图书管理系统实现
- Effectiv STL 37 Use accumulate or for_each to summarize ranges
- Webuploader教程(一)------简单实用上传功能
- DDR原理
- 406. Queue Reconstruction by Height(greedy)
- oracle left join 的注意事项
- [机器学习] 代价函数(cost function)
- NP理论(3):层次与中国传统逻辑 已有 1126 次阅读 2016-8-30 12:57 |个人分类:NP理论|系统分类:科研笔记|关键词:NP理论 层次 中国传统逻辑 白马非马 我们曾用中国传统