观察者模式(Observer Pattern)是Java开发中常用的模式之一,是一种设计模式,用于定义对象之间
的一对多
依赖关系,当一个对象的状态
发生变化时,所有依赖它的对象都会得到通知并自动更新
。下面使用Java代码看一下它的使用用法。
import java.util.ArrayList;
import java.util.List;
// 主题接口
interface Subject {
void registerObserver(Observer observer); //注册
void removeObserver(Observer observer); //移除
void notifyObservers(); //通知
}
// 具体主题
class ConcreteSubject implements Subject {
private List<Observer> 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();
}
}
// 主题状态发生变化时调用该方法
public void stateChanged() {
notifyObservers();
}
}
// 观察者接口
interface Observer {
void update();
}
// 具体观察者
class ConcreteObserver implements Observer {
@Override
public void update() {
System.out.println("Observer is notified and updated.");
}
}
// 测试类
public class ObserverPatternExample {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
ConcreteObserver observer1 = new ConcreteObserver();
ConcreteObserver observer2 = new ConcreteObserver();
subject.registerObserver(observer1);
subject.registerObserver(observer2);
subject.stateChanged();
}
}
优点:
- 观察者模式实现了主题和观察者之间的解耦,使得
主题和观察者可以独立地扩展和变化
。 - 支持
广播通知
,一个主题可以通知多个观察者,提高系统的灵活性和可维护性。
缺点:
- 如果观察者过多或通知频繁,可能会影响系统性能。
- 如果观察者和主题之间存在循环依赖,可能导致系统混乱。
使用场景:
- 当一个
对象的状态
改变需要通知其他对象,并且不知道具体有多少个对象需要通知时,可以使用观察者模式。 - 在事件驱动的系统中,观察者模式常被
用于处理事件的订阅与通知
。