观察者模式是一种行为型设计模式,其中一个对象(主题)维护一组依赖于它的对象(观察者),当主题的状态发生变化时,所有的观察者都会得到通知并自动更新。

在观察者模式中,通常有以下角色:

1. 主题(Subject): 维护一组观察者对象,提供添加、删除观察者以及通知观察者的方法。
import java.util.ArrayList;
import java.util.List;

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

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

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

    public void notifyObservers(String message) {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }
}

2. 具体主题(ConcreteSubject): 继承自主题,负责维护具体的状态,并在状态变化时通知观察者。
public class ConcreteSubject extends Subject {
    private String state;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
        notifyObservers("State changed: " + state);
    }
}

3. 观察者(Observer): 定义一个更新方法,用于接收主题的通知。
public interface Observer {
    void update(String message);
}

4. 具体观察者(ConcreteObserver): 实现观察者接口,具体实现更新方法。
public 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 message: " + message);
    }
}

5. 客户端代码: 创建主题、观察者对象,并将观察者注册到主题,当主题状态变化时,观察者会收到通知。
public class Client {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();

        ConcreteObserver observer1 = new ConcreteObserver("Observer 1");
        ConcreteObserver observer2 = new ConcreteObserver("Observer 2");

        subject.addObserver(observer1);
        subject.addObserver(observer2);

        subject.setState("New State");
    }
}

在这个例子中,具体主题(ConcreteSubject)维护了一个状态,并在状态变化时通知观察者。观察者(ConcreteObserver)接收到通知后执行相应的更新操作。观察者模式使得主题和观察者之间的关系松耦合,更容易扩展和维护。


转载请注明出处:http://www.zyzy.cn/article/detail/13956/设计模式