观察者模式详解
1. 定义与描述
观察者模式是一种行为型设计模式,它定义了对象之间的一种一对多依赖关系。这种模式中,有一个被观察的对象(称为主题Subject)和多个观察该对象的观察者(Observer)。主题对象负责维护一组观察者对象,并在自身状态发生改变时通知所有观察者。
2. 结构与角色
观察者模式包含以下几个角色:
• 主题(Subject):定义了观察者注册、移除和通知的方法。
• 具体主题(ConcreteSubject):实现主题接口,维护一个观察者列表,当状态发生变化时通知所有观察者。
• 观察者(Observer):定义了一个更新接口,当接收到主题的通知时更新自己。
• 具体观察者(ConcreteObserver):实现观察者接口,更新自己的状态以与主题的状态保持一致。
3. 适用场景
观察者模式适用于以下场景:
• 当一个对象的改变需要同时改变其他对象,而不知道具体有多少个对象有待改变时。
• 当一个抽象模型有两个方面,其中一个方面依赖于另一方面,这时可以通过观察者模式将这两者封装在独立的对象中以使它们各自独立地改变和复用。
• 当对一个对象的改变需要广播到其他对象时。
4. 应用实例
观察者模式广泛应用于各种需要通知多个对象进行同步更新的场合,包括但不限于:
• GUI事件监听机制:在图形用户界面编程中,按钮、文本框等控件的事件处理通常使用观察者模式。
• 数据模型与视图同步:在MVC架构中,观察者模式常用于数据模型和视图之间的更新同步。
• 发布-订阅系统:观察者模式是发布-订阅系统的基础,允许不同的服务订阅某个主题并接收通知。
• 股票价格监控:在金融系统中,观察者模式可以让股票价格的变化自动通知所有依赖该数据的系统。
• 社交媒体的通知机制:当用户发布新动态时,所有关注者都会收到通知。
5. 代码示例
以下是一个简单的观察者模式的代码示例,展示了如何实现一个股票价格通知系统:
public interface IStock {
void RegisterObserver(IObserver observer);
void RemoveObserver(IObserver observer);
void NotifyObservers();
}
public class Stock implements IStock {
private List<IObserver> _observers = new ArrayList<>();
private String symbol;
private double price;
public Stock(String symbol, double price) {
this.symbol = symbol;
this.price = price;
}
public String getSymbol() {
return symbol;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
NotifyObservers();
}
@Override
public void RegisterObserver(IObserver observer) {
_observers.add(observer);
}
@Override
public void RemoveObserver(IObserver observer) {
_observers.remove(observer);
}
@Override
public void NotifyObservers() {
for (IObserver observer : _observers) {
observer.Update(this);
}
}
}
public interface IObserver {
void Update(Stock stock);
}
public class StockObserver implements IObserver {
private String name;
public StockObserver(String name) {
this.name = name;
}
@Override
public void Update(Stock stock) {
System.out.println("Observer " + name + ": Stock " + stock.getSymbol() + " price updated to " + stock.getPrice());
}
}
// 客户端代码
public class Program {
public static void main(String[] args) {
Stock appleStock = new Stock("AAPL", 150.00);
IObserver observer1 = new StockObserver("Observer1");
IObserver observer2 = new StockObserver("Observer2");
appleStock.RegisterObserver(observer1);
appleStock.RegisterObserver(observer2);
appleStock.setPrice(155.00);
appleStock.setPrice(160.00);
appleStock.RemoveObserver(observer1);
appleStock.setPrice(165.00);
}
}
在这个示例中,Stock 类是具体的主题,StockObserver 是具体观察者,它们通过RegisterObserver和RemoveObserver方法注册和注销观察者,并通过NotifyObservers方法在状态变化时通知所有观察者。