Oberver Define
Observer Patterns 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。
核心思想
发布-订阅机制:对象之间的解耦。
动态更新:观察者可以在运行时添加或移除。
结构
- Subject(主题):维护观察者列表,提供注册和移除观察者的方法。
- Observer(观察者):定义更新接口,当接收到通知时更新自身。
- ConcreteSubject(具体主题):实现主题接口,通知状态改变。
- ConcreteObserver(具体观察者):实现更新接口,响应主题的状态变化。
Example
先定义出主题接口,在实现主题类,主题类里面可以存储订阅者对象,当主题对象接收到新消息的时候,就遍历全部存储好的订阅者,遍历给他们发消息。
interface
// 定义主题接口
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
// 定义订阅者接口
public interface Observer {
void update(String message);
}
Concrete
// 实现主题类
public class ConcreteSubject implements Subject {
private List<Observer> observers;
private String state;
public ConcreteSubject() {
observers = new ArrayList<>();
}
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(state);
}
}
public void setState(String state) {
this.state = state;
notifyObservers();
}
}
// 实现订阅者类
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);
}
}
client
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
ConcreteObserver observer1 = new ConcreteObserver("Observer 1");
ConcreteObserver observer2 = new ConcreteObserver("Observer 2");
subject.registerObserver(observer1);
subject.registerObserver(observer2);
subject.setState("Hello World!");
// 输出:Observer 1 received message: Hello World!
// Observer 2 received message: Hello World!
}
我们创建了一个具体的主题ConcreteSubject和一个具体的订阅者ConcreteObserver。
然后我们创建了两个订阅者并注册到主题。当状态改变时,主题会通知所有注册的订阅者。