(09)观察者模式


概念

定义对象之间的一对多依赖关系(一个被观察者,多个观察者),当被观察者的状态发生改变时,所有的观察者都得到通知。也称为发布-订阅模式

  • 吃蛙来哒需要在大众点评APP叫号排队,有A/B/C三人都在大众点评APP叫号,等待APP通知什么时候去吃蛙来哒。那么APP与A/B/C三人就形成了一对多的依赖关系。可以理解成A/B/C三人订阅了大众点评APP,当APP通知什么时候用餐时,A/B/C三人都能得到相应的消息
  • 被观察者:大众点评APP。观察者:用户A/B/C

实现方式

import java.util.ArrayList;
import java.util.List;

/**
 * 观察者
 */
public class Demo {
    public static void main(String[] args) {
        App app = new App();
        // app中添加两个观察者
        app.add(new BinaryObserver());
        app.add(new HexObserver());

        // 当状态发生变化,则通知相应的观察者
        app.setState(33);

        //运行结果
        //BinaryObserver 监听到状态发生变化:100001
        //HexObserver 监听到状态发生变化:21
    }
}

// 事件,当被观察者状态发生变化,则给观察者发送一个事件,一般事件中传递被观察者对象.
// 事件中还能记录发送时间等额外信息
class Event {
    private App source;

    public Event(App source) {
        this.source = source;
    }

    public App getSource() {
        return this.source;
    }
}

// 被观察者
class App {
    // 被观察者中,存储多个观察者
    private List observerList = new ArrayList<>();
    private int state;

    public void add(Observer observer) {
        observerList.add(observer);
    }

    // 状态改变,通知所有观察者
    public void setState(int state) {
        this.state = state;
        observerList.forEach(t -> t.listener(new Event(this)));
    }

    public int getState() {
        return state;
    }
}

// 观察者接口。所有观察者类都要实现该接口
interface Observer {
    void listener(Event event);
}

// 具体观察者
class BinaryObserver implements Observer {
    public void listener(Event event) {
        System.out.println("BinaryObserver 监听到状态发生变化:" + Integer.toBinaryString(event.getSource().getState()));
    }
}

// 具体观察者
class HexObserver implements Observer {
    public void listener(Event event) {
        System.out.println("HexObserver 监听到状态发生变化:" + Integer.toHexString(event.getSource().getState()));
    }
}

BinaryObserver 监听到状态发生变化:100001
HexObserver 监听到状态发生变化:21