观察者模式与发布订阅模式

一、观察者模式

【1】定义

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

【2】解决的问题

一个对象状态改变给其他对象通知的问题,而且要兼具易用性和低耦合,保证高度的协作。

【3】模式中的角色

抽象主题(Subject)

它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。

具体主题(ConcreteSubject)

将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。

抽象观察者(Observer)

为所有的具体观察者定义一个接口,在得到主题通知时更新自己。

具体观察者(ConcreteObserver)

实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。

【4】代码实现

主题接口

public interface Subject {
    void addObserver(Observer observer);

    void delObserver(Observer observer);

    void change(String version);
}

主题实现

public class SubjectImp implements Subject {

    private ArrayList<Observer> observers = new ArrayList<Observer>();

    private String version;

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

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

    @Override
    public void change(String version) {
        this.version = version;
        for (Observer o : observers) {
            o.update(version);
        }
    }
}

【观察者接口】

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

【观察者实现】

public class ObserverImp implements Observer {

    private String name;

    public ObserverImp(String name) {
        this.name = name;
    }

    @Override
    public void update(String version) {
        System.out.println(this.name + " 收到更新..." + "version: " + version);
    }
}

监听测试

public class Test {
    public static void main(String[] args) {
        new Thread(() -> {
            Subject subjects = new SubjectImp();
            subjects.addObserver(new ObserverImp("观察者1"));
            subjects.addObserver(new ObserverImp("观察者2"));
            subjects.change("0.01 SNAPSHOT");
            subjects.change("0.02 RELEASE");
        }).start();
    }
}

二、发布订阅模式

【1】定义

【2】解决的问题

posted @ 2021-08-27 11:27  Ho-Yu-Fung  阅读(35)  评论(0编辑  收藏  举报