// 观察者模式允许对象在另一个对象的状态更改时得到通知。
// 优点:
// 1.对象之间的松耦合,使得可以轻松添加或删除观察者,而不影响主题或其他观察者。
// 2.支持开放/封闭原则,允许添加新的观察者而不修改主题。
// 3.支持单一职责原则,将主题和观察者的关注点分离。
// 缺点:
// 1.主题可能发送对某些观察者不相关的通知,导致资源浪费。
// 2.通知观察者的顺序可能很重要,但该模式不支持此功能。
// 3.如果观察者依赖于主题的状态并且主题以意外的方式更改,则观察者可能处于不一致的状态。
// 用例:
// 1.需要在模型更改状态时更新的GUI组件。
// 2.需要在事件发生时通知的日志记录框架。
// 3.需要在多个节点之间同步状态的分布式系统。
interface Observer {
void update(String message);
}
// Subject interface
interface Subject {
void attach(Observer observer);
void detach(Observer observer);
void notifyObservers(String message);
}
// Concrete Subject
class ConcreteSubject implements Subject {
private List<Observer> observers = new ArrayList<>();
@Override
public void attach(Observer observer) {
observers.add(observer);
}
@Override
public void detach(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers(String message) {
for (Observer observer : observers) {
observer.update(message);
}
}
}
// Concrete Observer
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);
}
}
public class test {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
ConcreteObserver observer1 = new ConcreteObserver("Observer 1");
ConcreteObserver observer2 = new ConcreteObserver("Observer 2");
subject.attach(observer1);
subject.attach(observer2);
subject.notifyObservers("Hello World!");
subject.detach(observer1);
subject.notifyObservers("Hello Again!");
}
}