设计模式-观察者设计模式
来源:互联网 发布:伊顿穆勒编程软件 编辑:程序博客网 时间:2024/05/18 09:06
观察者模式
引入:
在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度
记录日志等。对于这一类问题,很接近java设计模式里面的“观察者模式”,它适合解决多种对象跟踪一个对象数据变化的程序结构问题
一、定义
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对 象。这个主题对象在状态上发生变化时, 会通知所有观察者对象,让他们能够自动更新自己
现实案例:多个男孩暗恋同一个女孩,那么这几个男孩肯定会时刻关注这个女孩,当女孩不开心时,男孩肯定也不开心,当女孩开心时,男孩也开心
二、使用场合
1) 当一个抽象模型,其中一个方面依赖于另一个方面时,把这两者封装到独立的对象中,使其可以独立的改变和复用
2)改变一个对象需要同时改变其他对象,但不知道有多少对象有待于改变
3)一个对象必须通知其它对象,但又不能假定这些对象(也就是说这写对象是不能紧密耦合的),比如数据采集模块,当采集数据以后,必须通知其它对象,但在开发采集模块的时候,事先并不知道其他对象是什么
三、观察者设计模式的组成
1)抽象主题角色(类似于女孩):把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者,一般使用抽象类或者接口来实现
2)具体主题角色:在具体主题内部状态改变时,给所有登陆过的观察者发出通知,具体主题角色通常用一个子类实现
3)抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
4)具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使得本身的状态与主题的状态相协调,如果需要,具体观察者角色可以保存一个指向具体主题角色的引用,通常用一个子类实现
四、类图与时序图
五、代码实现
package cn.org.kingdom.observer;import java.util.ArrayList;import java.util.List;//观察者角色interface Observer{void update(Object object);//该方法可以带参数也可以不带}//具体的观察者class ConcreteObserver implements Observer{@Overridepublic void update(Object obj) {System.out.println("receive:"+obj);}}//主题角色interface Subject{public void attach(Observer observer);public void detach(Observer observer);public void notifyObservers(Object obj);}//具体的主题角色class ConcreteSubject implements Subject{private List<Observer> list = new ArrayList<Observer>();@Overridepublic void attach(Observer observer) {list.add(observer);}@Overridepublic void detach(Observer observer) {list.remove(observer);}@Overridepublic void notifyObservers(Object obj) {for (Observer observer : list) {observer.update(obj);}}public void invoke(){for(int i=0;i<10;i++){System.out.println(i);notifyObservers(i);}}}public class ObserverTest {public static void main(String[] args) {ConcreteSubject subject = new ConcreteSubject();//创建主题对象Observer observer1 = new ConcreteObserver();//创建观察者对象Observer observer2 = new ConcreteObserver();Observer observer3 = new ConcreteObserver();subject.attach(observer1);//加入观察者subject.attach(observer2);subject.attach(observer3);subject.invoke();//调用subject.detach(observer1);subject.detach(observer2);subject.invoke();}}六、观察者设计模式的好处
观察者模式提供了一种对象设计,让主题和观察者之间耦合度降得很低,为什么呢?关于观察者的一切,主题只知道观察者实现了Observer接口,并不需要观察者具体的类是谁,做了什么或者其他细节.这样的话,由于松耦合,改变主题或者观察者其中一方,并不会影响另一方,只要他们之间的接口仍被遵守,就可以自由地改变它.降低对象之间的耦合度,也是面设对象设计的一个很重要的原则.
- 模式设计:观察者模式
- 设计模式-----观察者模式
- 设计模式-观察者模式
- 设计模式--观察者模式
- 设计模式:观察者模式
- 设计模式-----观察者模式
- 设计模式:观察者模式
- 设计模式-观察者模式
- 设计模式 观察者模式
- 设计模式-观察者模式
- 设计模式-【观察者模式】
- 设计模式-观察者模式
- 设计模式 -- 观察者模式
- 设计模式-观察者模式
- 【设计模式】观察者模式
- 设计模式- 观察者模式
- 设计模式- 观察者模式
- 设计模式--观察者模式
- PHP-约瑟夫环
- You need to use a Theme.AppCompat theme (or descendant) with this activity.
- 编写优质嵌入式C程序
- 为什么python性能差
- ECMAScript6(ES6)
- 设计模式-观察者设计模式
- 如何用jquery获取input输入框中的值?
- MFC学习日志(一)
- LFU缓存策略
- PHP -单例模式 -简单工厂-抽象工厂
- Quartz介绍
- 工作遇到一个简单问题的思考
- centos下批量ping检测IP是不是通的
- 后期十天学习计划