观察者模式
来源:互联网 发布:js给输入框赋值 编辑:程序博客网 时间:2024/05/21 18:36
理解
- 对象间的一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于他的对象得到通知并被自动更新
主要解决
- 一个对象状态改变给其他对象通知的问题,要考虑到易用和低耦合,保证高度的协作
如何解决
- 使用面向对象技术,弱化依赖
优点
- 观察者和被观察者是抽象耦合的
- 建立一套触发机制
缺点
- 如果一个被观察者对象有很多直接或间接的观察者,要全部都通知到,会花费很多的时间
- 如果在观察者和观察目标之间有循环依赖,观察目标会触发循环调用,可能导致系统崩溃
- 观察者模式没有相应的机制让观察者知道观察目标是怎么发生变化的,仅仅知道观察目标发生了变化
使用场景
- 有多个子类共有的方法,且逻辑相同
- 重要的、复杂的方法,可以考虑作为模板方法
注意事项
- Java中已经有了对观察者模式的支持类
- 避免循环引用
- 如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式
第一步
- 创建Subject类(Subject.java)
import java.util.ArrayList;import java.util.List;public class Subject { private List<Observer> observers = new ArrayList<Observer>(); private int state; public int getState() { return state; } public void setState(int state) { this.state = state; notifyAllObservers(); } public void attach(Observer observer) { observers.add(observer); } public void notifyAllObservers() { for(Observer observer : observers){ observer.update(); } }}
第二步
- 创建Observer类 (Observer.java)
public abstract class Observer { protected Subject subject; public abstract void update();}
第三步
- 创建实体观察者类
- FirstObserver.java、SecondObserver.java、ThirdObserver.java
public class FirstObserver extends Observer{ public FirstObserver (Subject subject) { this.subject = subject; } @Override public void update() { System.out.println("First : " + subject.getState()); }}
public class SecondObserver extends Observer{ public SecondObserver (Subject subject) { this.subject = subject; } @Override public void update() { System.out.println("Second : " + subject.getState()); }}
public class ThirdObserver extends Observer{ public ThirdObserver (Subject subject) { this.subject = subject; } @Override public void update() { System.out.println("Third : " + subject.getState()); }}
第四步
- 客户端调用(ObserverDemo.java)
public class ObserverDemo { public static void main(String[] args) { Subject subject = new Subject(); FirstObserver firstObserver = new FirstObserver(subject); SecondObserver secondObserver = new SecondObserver(subject); ThirdObserver thirdObserver = new ThirdObserver(subject); subject.attach(firstObserver); subject.attach(secondObserver); subject.attach(thirdObserver); System.out.println("First state change : 15"); subject.setState(15); System.out.println("Second state change : 8"); subject.setState(8); }}
第五步
- 收获结果
First state change : 15First : 15Second : 15Third : 15Second state change : 8First : 8Second : 8Third : 8
阅读全文
1 0
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- MTK OTA (一)
- MySQL的一主二从异步复制(半同步复制)
- c++中lambda表达式的用法
- selenium调用火狐浏览器
- 关系型数据库和非关系型数据库的特性以及各自的优缺点
- 观察者模式
- AutoLayout中一些需要注意的点--结合Masonry使用
- Mysql进阶:方便的replace into语法
- 第十一周项目4
- uavcan扩展帧格式
- 解决Windows资源管理器右键菜单打开EditPlus容易导致资源管理器无响应问题
- @SpringApplicationConfiguration(classes = Application.class) 报错,注解不能导入。
- 详解tomcat的连接数与线程池
- 1193分数序列求和