Design Pattern - Observer Pattern
观察者模式
为了后续继续聊 Java IO-Netty,先谈下观察者模式(Observer Pattern)
定义与工作原理
定义:观察者模式是一种对象行为模式,其中一个对象(称为“主题”)维护一组依赖于其的对象(称为“观察者”),并在其状态发生改变时自动通知它们。
工作原理:主题提供一个注册和注销观察者的机制,当主题的状态发生变化时,它会通知所有注册的观察者。
实现方式
- 松耦合设计:确保主题和观察者之间的耦合度低,易于扩展。
- 动态注册与注销:允许观察者动态地注册和注销,以适应变化。
类图
示例代码
import java.util.ArrayList;
import java.util.List;
interface Observer {
void update(String message);
}
interface Subject {
void registerObserver(Observer o);
void removeObserver(Observer o);
void notifyObservers(String message);
}
class ConcreteSubject implements Subject {
private List<Observer> observers = new ArrayList<>();
private String state;
@Override
public void registerObserver(Observer o) {
if (!observers.contains(o)) {
observers.add(o);
}
}
@Override
public void removeObserver(Observer o) {
observers.remove(o);
}
@Override
public void notifyObservers(String message) {
for (Observer observer : new ArrayList<>(observers)) {
observer.update(message);
}
}
public void setState(String state) {
this.state = state;
notifyObservers("State changed to: " + 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 update: " + message);
}
}
public class ObserverDemo {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
ConcreteObserver observer1 = new ConcreteObserver("Observer1");
ConcreteObserver observer2 = new ConcreteObserver("Observer2");
// 注册观察者
subject.registerObserver(observer1);
subject.registerObserver(observer2);
// 状态更新,触发通知
subject.setState("Active");
// 模拟状态变化
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
subject.setState("Inactive");
}
}
总结
- 初始化工作确定被观察者的信息,注册观察者(observer)的信息注册到被观察者(subject)信息里面
- 当被观察者信息修改时,则通知所有的观察者