​​九、观察者模式(ObServer)_接口实现


一、什么是观察者模式

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


二、观察者模式角色

    1、Subject:叫做主题或抽象通知者,一般用一个抽象类或接口实现。它把所有对观察者对象保存在一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。

    2、ConcreteSubject:叫做具体主题或具体通知者,将有关状态存入具体观察者对象;在具体主题的内部状态改变时,将所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。

    3、Observer:抽象观察者,为所有的具体观察者定义一个接口,在得到主题通知时更新自己。这个接口叫做更新接口。抽象观察者一般用一个抽象类或者一个接口实现。更新接口通常包含一个update()方法。

    4、ConcreteObserver:具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。具体观察者角色可以保存一个具体主题对象的引用。具体观察者角色通常用一个具体子类实现。


三、观察者模式类图

        九、观察者模式(ObServer)_java_02


四、观察者模式代码

    1、Subject

//主题
public abstract class Subject {
//观察者的存储集合
private List<Observer> observers = new ArrayList<>();
// 注册观察者方法
public void addObserver(Observer observer){
observers.add(observer);
}

// 删除观察者方法
public void deleteObserver(Observer observer){
observers.remove(observer);
}
//通知所有观察者更新
public void notifyObserver(){
observers.forEach(Observer::update);
}
}

    2、Observer

//观察者
public abstract class Observer {
//更新观察者
public abstract void update();
}

    3、ConcreteSubject

public class ConcreteSubject extends Subject {
//状态
private String state;

public String getState() {
return state;
}

public void setState(String state) {
this.state = state;
//通知所有观察者
this.notifyObserver();
}
}

    4、ConcreteObserver

public class ConcreteObserver extends Observer {

@Override
public void update() {
System.out.println("subject状态改变了,执行XX业务...");
}
}

    5、客户端

public class MainClass {

public static void main(String[] args) {

Observer observer = new ConcreteObserver();

ConcreteSubject subject = new ConcreteSubject();
subject.addObserver(observer);

subject.setState("Update");
}
}

        Java种提供了观察者模式的实现java.util.Observable、java.util.Observer,有兴趣的可以看看。