详解设计模式:观察者模式

以你之姓@ 2023-09-23 17:23 170阅读 0赞

观察者模式(Observer Pattern)也被称为发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式,是在 GoF 23 种设计模式中定义了的行为型模式。

观察者模式 定义了一对多的关系,让多个观察者对象同时监听某一个主体对象,这个主体对象发生变化时就会通知所有的观察者对象,使得他们能够自己更新自己。

本片文章内容包括:关于观察者模式、观察者模式 Demo(伪代码)


文章目录

    • 一、关于观察者模式
        • 1、关于观察者模式
        • 2、关于观察者模式构成
        • 3、关于观察者模式XML
        • 4、观察者模式解决的问题
        • 5、观察者模式的优点和缺点
    • 二、观察者模式 Demo(伪代码)
        • 1、伪代码 Demo 实现
        • 2、Demo 测试

一、关于观察者模式

1、关于观察者模式

观察者模式(Observer Pattern)也被称为发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式,是在 GoF 23 种设计模式中定义了的行为型模式。

观察者模式 定义了一对多的关系,让多个观察者对象同时监听某一个主体对象,这个主体对象发生变化时就会通知所有的观察者对象,使得他们能够自己更新自己。

观察者模式的特点:

  1. 被观察者不知道具体的观察者是谁,只知道自己被观察了,并且在合适的时机进行广播,让感兴趣的观察者知道发生了什么事情;
  2. 观察者依赖于被观察者,被观察者不依赖于观察者,是单向关系,耦合程度不高。没有被观察者,观察者无法工作;没有观察者,被观察者该干啥干啥,因为被观察者本来就不清楚谁观察他,发广播是被观察的个人行为;
  3. 通常被观察者出现行为上的变化,需要观察者做出反馈。显然一般情况下观察者并不知道被观察者啥时候会有变化,因此该反馈是一种被动反馈,实现的是一种回调机制。

2、关于观察者模式构成

策略模式主要由 4 种角色构成:

  • 目标(Subject):目标又称为主题,它是指被观察的对象。在目标中定义了一个观察者集合,一个观察目标可以接受任意数量的观察者来观察,它提供了一系列方法来增加和删除观察者对象,同时它定义了通知方法 notify()。目标类可以是接口,也可以是抽象类或具体类。
  • 具体目标(ConcreteSubject):具体目标是目标类的子类,它通常包含有经常发生改变的数据,当它的状态发生改变时它向各个观察者发出通知;同时它还实现了在目标类中定义的抽象业务逻辑方法。如果无须扩展目标类,具体目标类可以省略。
  • 观察者(Observer):观察者将对观察目标的改变做出反映,观察者一般定义为接口,该接口声明了更新数据的方法 update(),因此又称为抽象观察者。
  • 具体观察者(ConcreteObserver):在具体观察者中维护一个指向具体目标对象的引用,它存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致;它实现了在抽象观察者 Observer 中定义的 update() 方法。通常在实现时可以调用具体目标类的 attach() 方法将自己添加到目标类的集合中或者通过 detach() 方法将自己从目标类的集合中删除。

3、关于观察者模式XML

观察者模式

4、观察者模式解决的问题

  • 定义对象之间的一对多依赖关系而不使对象紧密耦合。
  • 确保当一个对象改变状态时,自动更新开放数量的从属对象。
  • 一个对象应该可以通知开放式数量的其他对象

5、观察者模式的优点和缺点

# 观察者模式的优点

  • 观察者与被观察者抽象耦合,容易扩展;
  • 建立了一套触发机制。

# 观察者模式的缺点:

  • 循环依赖会导致系统崩溃;
  • 观察者太多会浪费时间。

二、观察者模式 Demo(伪代码)

1、伪代码 Demo 实现

# Subject 目标

  1. import java.util.List;
  2. import java.util.ArrayList;
  3. public abstract class Subject {
  4. /**
  5. * 定义一个观察者集合用于存储所有观察者对象
  6. */
  7. protected List<Observer> observers = new ArrayList<Observer>();
  8. /**
  9. * 注册方法,用于向观察者集合中增加一个观察者
  10. * @param observer Observer
  11. */
  12. public void attachObserver(Observer observer) {
  13. observers.add(observer);
  14. }
  15. /**
  16. * 注销方法,用于在观察者集合中删除一个观察者
  17. * @param observer Observer
  18. */
  19. public void detachObserver(Observer observer) {
  20. observers.remove(observer);
  21. }
  22. /**
  23. * 声明抽象通知方法
  24. */
  25. public abstract void notifyObserver();
  26. }

# ConcreteSubject 具体目标

  1. public class ConcreteSubject extends Subject {
  2. /**
  3. * 实现通知方法
  4. */
  5. @Override
  6. public void notifyObserver() {
  7. //遍历观察者集合,调用每一个观察者的响应方法
  8. for(Observer obs:observers) {
  9. obs.update();
  10. }
  11. }
  12. }

# Observer 观察者

  1. public interface Observer {
  2. /**
  3. * 声明响应方法
  4. */
  5. public void update();
  6. }

# ConcreteObserver 具体观察者

  1. public class ConcreteObserverA implements Observer {
  2. /**
  3. * 实现响应方法
  4. */
  5. @Override
  6. public void update() {
  7. //具体响应代码
  8. System.out.println("ConcreteObserverA 相应");
  9. }
  10. }
  11. public class ConcreteObserverB implements Observer {
  12. /**
  13. * 实现响应方法
  14. */
  15. @Override
  16. public void update() {
  17. //具体响应代码
  18. System.out.println("ConcreteObserverB 相应");
  19. }
  20. }

2、Demo 测试

  1. public class Client {
  2. public static void main(String[] args) {
  3. Subject subject = new ConcreteSubject();
  4. subject.attachObserver(new ConcreteObserverA());
  5. subject.attachObserver(new ConcreteObserverB());
  6. subject.notifyObserver();
  7. }
  8. }

发表评论

表情:
评论列表 (有 0 条评论,170人围观)

还没有评论,来说两句吧...

相关阅读

    相关 设计模式-观察模式

    观察者模式 引言 > 今天开车出去有事,还挺赶时间的,突然遇到了一个红灯,这红灯时间可真长,等了好久终于看到变绿灯了,赶紧开车过去。 正文 观察者模式是指多

    相关 设计模式-观察模式

    观察者模式也叫订阅发布模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

    相关 设计模式:观察模式

    一.简介 > QT的信号槽就是观察者模式,当事件发生之后(比如按钮被点击)就会发出一个信号,这种信号类似广播没有目的.当对象对信号感兴趣,就会通过 connect() 函

    相关 设计模式--观察模式

    定义 在对象之间定义了一对多的依赖,当一方发生改变时,依赖它的对象都会受到通知并自动更新。 其实可以理解为消息发布者(被观察者)与订阅者(观察者),用户可以订阅或者取消