观察者模式

观察者模式定义了一种“一对多”关系,它可以让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时会通知所有观察者对象,让它们能够自动进行某种处理。

观察者模式示例

下面代码是一个简单的观察者模式实现例子代码。

Subject.java

public class Subject {
    private List<Observer> observerList = new ArrayList<>();

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

    public void unsubscribe(Observer observer) {
        this.observerList.remove(observer);
    }

    public void inform() {
        for (Observer o : observerList) {
            o.update();
        }
    }
}

Observer.java

public abstract class Observer {
    public abstract void update();
}

ObserverA.java

public class ObserverA extends Observer {
    @Override
    public void update() {
        System.out.println("observer A");
    }
}

ObserverB.java

public class ObserverB extends Observer {
    @Override
    public void update() {
        System.out.println("observer B");
    }
}

Main.java

public class Main {
    public static void main(String[] args) {
        Subject subject = new Subject();

        Observer observerA = new ObserverA();
        Observer observerB = new ObserverB();

        subject.subscribe(observerA);
        subject.subscribe(observerB);

        subject.inform();
    }
}

如上述代码所示,实际上观察者模式实现起来比较简单,Subject维护了所有观察它的Observer列表,当Subject想要通知所有观察者时就会遍历所有观察者并调用其update()方法。

灵活调整代码结构

观察者模式十分常用,面对不同的业务需求应该灵活调整观察者模式的结构,而不是死板的生搬硬套设计模式。比如:对观察者和被观察者做出适当的抽象,在通知过程中添加数据等。实际上,观察者模式和回调函数比较像,回调函数中,回调接口就是观察者,观察者模式则是更加抽象的升级版回调。

作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。