Dotcpp  >  编程教程  >  行为型模式(Behavioral Patterns)  >  观察者模式

观察者模式

点击打开在线编译器,边学边练

观察者模式在对象之间建立了一种一对多的依赖关系,当一个对象的状态发生改变时,它的所有依赖对象都会收到通知并自动更新。

在实际应用中,观察者模式非常适用于需要在对象之间建立动态的、松耦合的关系的场景。比如,当一个对象的状态变化时,我们希望其他相关对象能够及时得到通知并作出相应的处理,这时观察者模式就能够很好地满足这个需求。

在观察者模式中,有两个核心角色:观察者和被观察者。被观察者维护了一个观察者列表,并提供注册、移除和通知观察者的方法。观察者定义了一个更新接口,用来接收被观察者发来的通知。

观察者模式

下面是一个简单的示例,展示了如何使用观察者模式:

import java.util.ArrayList;
import java.util.List;
interface Observer {
    void update(String message);
}
class Subject {
    private List<Observer> observers = new ArrayList<>();
    private String state;
    public String getState() {
        return state;
    }
    public void setState(String state) {
        this.state = state;
        notifyObservers();
    }
    public void attach(Observer observer) {
        observers.add(observer);
    }
    public void detach(Observer observer) {
        observers.remove(observer);
    }
    private void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(state);
        }
    }
}
class ConcreteObserver implements Observer {
    private String name;
    public ConcreteObserver(String name) {
        this.name = name;
    }
    @Override
    public void update(String message) {
        System.out.println(name + " received a message: " + message);
    }
}
public class ObserverPatternDemo {
    public static void main(String[] args) {
        Subject subject = new Subject();
        ConcreteObserver observer1 = new ConcreteObserver("Observer 1");
        ConcreteObserver observer2 = new ConcreteObserver("Observer 2");
        subject.attach(observer1);
        subject.attach(observer2);
        subject.setState("Message 1"); // 输出:Observer 1 received a message: Message 1, Observer 2 received a message: Message 1
        subject.detach(observer2);
        subject.setState("Message 2"); // 输出:Observer 1 received a message: Message 2
    }
}

在这个示例中,Subject类是被观察者,它维护了一个观察者列表和一个状态。当状态发生变化时,通过调用notifyObservers()方法来通知所有观察者。Observer接口定义了一个update()方法,用于接收被观察者发来的通知。

通过使用观察者模式,我们可以轻松实现对象之间的通信和协作,并且可以随时根据需求增加或移除观察者。


本文固定URL:https://www.dotcpp.com/course/1383

上一课:

备忘录模式

下一课:

状态模式

Dotcpp在线编译      (登录可减少运行等待时间)