跳转至

观察者模式

图片的样式

这个模式自己没有实际使用过,感觉对它的理解有点问题,有机会再搞清楚些。

观察者模式和发布订阅模式很像。 适用于当一个对象的状态变化需要通知多个其他对象时和事件驱动系统里面,消息队列里面就有应用, 但是它无法保证通知顺序,是随机的。

🏀代码样例

首先定义观察者,他需要时刻准备更新信息,然后需要有一个主题类,这个主题要求有增删观察者(订阅者), 还有提醒的功能。

public abstract class Observer {
    protected Subject subject;
    public abstract void update(String message);
}
public class Subject {
    private final List<Observer> observers = Lists.newArrayList();

    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    /**
     * 通知
     */
    public void notifyObservers(String message) {
        observers.forEach(observer -> observer.update(message));
    }
}

观察者接口只是一个抽象类,没有具体实现,为此可以根据业务增加子类。

public class BrickObserver extends Observer {

    public BrickObserver(Subject subject) {
        this.subject = subject;
        this.subject.registerObserver(this);
    }

    @Override
    public void update(String message) {
        System.out.println("砖头观察者接收到了信息:" + message);
    }
}
public class ConcreteObserver extends Observer {

    public ConcreteObserver(Subject subject) {
        this.subject = subject;
        this.subject.registerObserver(this);
    }

    @Override
    public void update(String message) {
        System.out.println("混凝土观察者接收到了信息:" + message);
    }
}
public class RebarObserver extends Observer {

    public RebarObserver(Subject subject) {
        this.subject = subject;
        this.subject.registerObserver(this);
    }

    @Override
    public void update(String message) {
        System.out.println("钢筋观察者接收到了信息:" + message);
    }
}

🐔使用方式

使用的时候只需要在有各自对象的时候,直接通知即可。

public class TestObserver {
    public static void main(String[] args) {
        Subject subject = new Subject();
        new ConcreteObserver(subject);
        new RebarObserver(subject);
        new BrickObserver(subject);
        subject.notifyAllObservers("大家准备开始造房子");
    }
}