设计模式之观察者模式

Posted ProChick

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之观察者模式相关的知识,希望对你有一定的参考价值。

1.简要概述

  • 观察者模式定义了对象之间的一对多关系,也就是说当一个对象的状态发生变化时,会告知其它的依赖对象也做相应的状态更新。
  • 观察者模式中,发送状态变化通知的对象称之为目标对象(Subject),接收并响应状态变化的对象称之为观察者对象(Observer)。

2.模式结构

👉通常由一个主题接口( 负责定义管理、维护、通知观察者的一系列方法接口 ),多个具体的主题类( 负责实现对于观察者的注册、移除、通知等功能的内部逻辑 ),一个观察者接口( 负责定义接收通知并更新的方法接口 ),多个具体的观察者类( 负责为不同的观察者实现不同的更新内部逻辑 ),一个客户类( 负责对主题类和观察者类进行调用)共同组成。

3.实现代码

举例 💡 :假设现在有一个新闻网站可供用户订阅,当网站发布新的新闻时,则会通知每个订阅者进行了更新。那么这个过程我们就可以使用观察者模式来进行处理。

发布者接口

public interface Publish {
    void register(Observer observer);

    void remove(Observer observer);

    void notify();
}

新闻发布者

public class NewsPublish implements Publish {
    private String news;
    
    private List<Observer> observers;

    public NewsPublish() {
        observers = new ArrayList<>();
    }

    public void setNews(String content) {
        this.news = content;
    }

    @Override
    public void register(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void remove(Observer observer) {
        if (observers.contains(observer)) {
            observers.remove(observer);
        }
    }

    @Override
    public void notify() {
        for (Observer observer : observers) {
            observer.update(news);
        }
    }
}

观察者接口

public interface Observer {
    void update(String content);
}

观察者

public class UserObserver implements Observer {

    @Override
    public void update(String content) {
        System.out.println("新闻更新: " + content);
    }
}

客户类

// 测试客户端
public class ObserverClient{
    public static void main(String[] args) {
		// 创建观察者
        Observer o1 = new UserObserver();
        Observer o2 = new UserObserver();
        
        // 创建发布者
        Publish publish = new NewsPublish();
        publish.add(o1);
        publish.add(o2);
        
        // 更新内容并通知观察者
        publish.setNews("新的新闻");
        publish.notify();
    }
}

4.优点好处

  • 观察者模式在被观察者和观察者之间建立一个抽象的耦合, 由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。
  • 在观察者模式中,我们可以随意的添加和移除指定的观察者,而不需要对发布者进行内部逻辑的更改,所以符合OCP原则。

5.缺点弊端

  • 如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
  • 如果在被观察者之间有循环依赖的话,被观察者在执行时很有可能发生循环调用,导致系统崩溃。

6.应用场景

  • 当我们想要在系统中实现类似于广播机制功能的时候使用。
  • 当对一个对象状态进行更新,需要其它有所关联的对象也同步进行更新,而且其它对象的数量可以动态改变的时候使用。
  • 当一个对象仅需要将自己的更新通知给其它对象,而不需要让其它对象知道内部细节的时候使用。

7.应用示例

JDK源码中的Observable类

  1. 这里的Observable类就相当于观察者模式中的主题类,只不过这里没有实现任何接口,直接进行的实现。

  2. 我们看到在Observable类中同样定义了添加观察者、移除观察者、通知观察者的一系列方法。

  3. 这里的Observer类就是观察者接口,里面定义了通知更新的update方法。

  4. 所以从上面的过程分析可以看出,JDK中的Observable类的设计就是使用的观察者模式。

以上是关于设计模式之观察者模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式 行为型模式 -- 观察者模式(发布-订阅(Publish/Subscribe)模式)

js设计模式之实现观察者模式实例代码

PHP设计模式之----观察者模式

PHP 设计模式之观察者模式

设计模式之观察者模式--PHP

设计模式之观察者模式2