经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
行为模式之观察者模式
来源:cnblogs  作者:yewen1234  时间:2018/12/3 10:08:58  对本文有异议

观察者模式(Observer Pattern)也称发布订阅模式,它是一种在项目中经常使用的模式。

定义:

  • 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。

观察者模式的类图如下所示。

观察者模式具体有以下4个角色。

  • 抽象主题(Subject)角色:又称为“被观察者”,可以增加和删除观察者对象。
  • 抽象观察者(Observer)角色:为所有具体观察者定义一个接口,在得到主题的通知时更新自己。
  • 具体主题(Concrete Subject)角色:又称“具体被观察者”,它将有关状态存入具体观察者对象,当它改变时,给所有登记过的观察者发出通知。
  • 具体观察者(Concrete Observer)角色:实现抽象观察者所有的更新接口,以便使自身状态与主题状态相协调。

Subject.java

  1. public interface Subject {
  2. // 登记一个新的观察者
  3. public void attach(Observer obs);
  4. // 删除一个登记过的观察者
  5. public void detach(Observer obs);
  6. // 通知所有登记过的观察者对象
  7. public void notifyObserver();
  8. }

Observer.java

  1. public interface Observer {
  2. // 更新方法
  3. public void update();
  4. }

ConcreteSubject.java

  1. public class ConcreteSubject implements Subject {
  2. private Vector<Observer> obsVector = new Vector<Observer>();
  3. @Override
  4. public void attach(Observer obs) {
  5. obsVector.add(obs);
  6. }
  7. @Override
  8. public void detach(Observer obs) {
  9. obsVector.remove(obs);
  10. }
  11. @Override
  12. public void notifyObserver() {
  13. for (Observer obs : obsVector) {
  14. obs.update();
  15. }
  16. }
  17. public Enumeration<Observer> observers() {
  18. return obsVector.elements();
  19. }
  20. // 业务方法,改变状态
  21. public void change() {
  22. this.notifyObserver();
  23. }
  24. }

ConcreteObserver.java

  1. public class ConcreteObserver implements Observer {
  2. @Override
  3. public void update() {
  4. System.out.println("收到通知,并进行处理");
  5. }
  6. }

Client.java

  1. public class Client {
  2. public static void main(String[] args) {
  3. // 创建一个主题对象(被观察者)
  4. ConcreteSubject subject = new ConcreteSubject();
  5. // 创建一个观察者
  6. Observer obs = new ConcreteObserver();
  7. // 登记观察者
  8. subject.attach(obs);
  9. // 改变状态
  10. subject.change();
  11. }
  12. }

 优点:

  • 观察者与被观察者之间是抽象耦合,它们属不同的抽象化层次,且都很容易扩展。
  • 支持广播通信。被观察者向所有登记过的观察者发出通知,这就是一个触发机制,形成一个触发链。

缺点:

  • 一个主题有多个直接或间接观察者,通知所有观察者会花费很多时间,且开发和调试都比较困难。
  • 如果主题之间有循环依赖,被观察者会触发它们之间进行循环调用,导致系统崩溃。
  • 如果对观察者的通知是通过另外的线程进行异步投递,系统必须保证投递的顺序执行。
  • 虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有提供相应的机制使观察者知道所观察的对象是如何发生变化。

应用场景:

  • 关联行为场景。
  • 事件多级触发场景。
  • 跨系统的消息交换场景,如消息队列的处理机制。

注意事项:

  • 广播链的问题一个观察者可以有双重身份,既是观察者又是被观察者,广播链一旦建立,逻辑就比较复杂,可给你的维护性非常差。一般在一个观察者模式中最多出现一个对象既是观察者也是被观察者,这样消息最多转发一次(传递两次)较易控制。
  • 异步处理的问题。异步处理就要考虑线程安全和队列问题。

引用:

青岛东合信息技术有限公司 . 设计模式(Java版) .  电子工业出版社,2012,149-152.

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号