简易的设计模式——观察者模式

观察者模式(Observer Pattern)也叫做发布订阅模式。

定义

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

几种角色

在观察者模式中有这么几种角色:

  1. Subject被观察者:定义被观察者必须能动态地增加和删除观察者,一般为抽象类。
  2. Observer观察者:观察者接受到消息之后,能对接受到得消息进行处理。
  3. ConcreteSubject具体的被观察者:定义被观察者自己的业务逻辑,同时定义哪些事件需要进行通知。
  4. ConcreteObserver具体的观察者:在接收到消息之后,对消息进行不同的处理。

代码实现

观察者 Observer.java

public interface Observer {
    public void update();
}

具体的观察者 ConcreteObserver.java

public class ConcreteObserver implements Observer {
    @Override
    public void update() {
        System.out.println("接收到消息,并进行处理!");
    }
}

被观察者 Subject.java

import java.util.Vector;

public abstract class Subject {

    //也可以使用ArrayList,ArrayList是线程异步的,不安全。
    private Vector<Observer> obsVector = new Vector<Observer>();

    public void addObserver(Observer observer){
        this.obsVector.add(observer);
    }

    public void delObserver(Observer observer){
        this.obsVector.remove(observer);
    }

    public void notifyObservers(){
        for (Observer observer: this.obsVector ){
            observer.update();
        }
    }

}

具体的被观察者 ConcreteSubject.java

public class ConcreteSubject extends Subject {
    public void doSomething(){
        //do something
        super.notifyObservers();
    }
}

场景类 Client.java

public class Client {
    public static void main(String args[]){

        ConcreteSubject subject = new ConcreteSubject();
        ConcreteObserver observer = new ConcreteObserver();

        subject.addObserver(observer);
        subject.doSomething();
    }
}

观察者模式的优点

  • 观察者和被观察者之间是抽象耦合

    即使不断增加观察者还是被观察者非常容易扩展

  • 建立一套触发机制

    根据单一职责原则,每个类的职责是单一的,通过一个触发机制,形成触发链。观察者就可以实现这种链式结构。

观察者模式的缺点

  • 观察者模式需要考虑一下开发效率和运行效率,当形成多级触发的时候,效率会令人担忧。消息的通知可以采用异步的方式进行。
posted @   whthomas  阅读(213)  评论(1编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示