观察者模式详解

观察者模式详解

  1. 定义与描述

观察者模式是一种行为型设计模式,它定义了对象之间的一种一对多依赖关系。这种模式中,有一个被观察的对象(称为主题Subject)和多个观察该对象的观察者(Observer)。主题对象负责维护一组观察者对象,并在自身状态发生改变时通知所有观察者。

  1. 结构与角色

观察者模式包含以下几个角色:

• 主题(Subject):定义了观察者注册、移除和通知的方法。

• 具体主题(ConcreteSubject):实现主题接口,维护一个观察者列表,当状态发生变化时通知所有观察者。

• 观察者(Observer):定义了一个更新接口,当接收到主题的通知时更新自己。

• 具体观察者(ConcreteObserver):实现观察者接口,更新自己的状态以与主题的状态保持一致。

  1. 适用场景

观察者模式适用于以下场景:

• 当一个对象的改变需要同时改变其他对象,而不知道具体有多少个对象有待改变时。

• 当一个抽象模型有两个方面,其中一个方面依赖于另一方面,这时可以通过观察者模式将这两者封装在独立的对象中以使它们各自独立地改变和复用。

• 当对一个对象的改变需要广播到其他对象时。

  1. 应用实例

观察者模式广泛应用于各种需要通知多个对象进行同步更新的场合,包括但不限于:

• GUI事件监听机制:在图形用户界面编程中,按钮、文本框等控件的事件处理通常使用观察者模式。

• 数据模型与视图同步:在MVC架构中,观察者模式常用于数据模型和视图之间的更新同步。

• 发布-订阅系统:观察者模式是发布-订阅系统的基础,允许不同的服务订阅某个主题并接收通知。

• 股票价格监控:在金融系统中,观察者模式可以让股票价格的变化自动通知所有依赖该数据的系统。

• 社交媒体的通知机制:当用户发布新动态时,所有关注者都会收到通知。

  1. 代码示例

以下是一个简单的观察者模式的代码示例,展示了如何实现一个股票价格通知系统:

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方法在状态变化时通知所有观察者。

相关推荐
workflower15 小时前
情境感知系统
人工智能·机器学习·设计模式·自然语言处理·机器人
咖啡八杯16 小时前
设计模式中的原则
设计模式·接口隔离原则·里氏替换原则·开闭原则·合成复用原则·单一职责原则
安冬的码畜日常18 小时前
【工欲善其事】深入理解 Node.js 带并发上限的异步任务批量执行逻辑
javascript·设计模式·node.js·ai编程·异步编程·并发执行
AI大法师1 天前
一个机场如何被做成 IP 场景:宝可梦机场的设计方法总结
大数据·人工智能·设计模式·新媒体运营
晚安code1 天前
干掉成山的 if-else:工厂造、策略选,一文讲透两个模式的配合
后端·设计模式
workflower2 天前
从幻觉,到现实
人工智能·深度学习·机器学习·设计模式·机器人
电子科技圈2 天前
第二代无线平台历久弥新,赋能物联网创新迭代
人工智能·嵌入式硬件·mcu·物联网·设计模式·硬件架构·iot
choumin2 天前
创建型模式——工厂方法模式
c++·设计模式·工厂方法模式·创建型模式
choumin2 天前
创建型模式——原型模式
c++·设计模式·原型模式·创建型模式
37.2℃9953 天前
Claude Design哪个公司技术好
python·设计模式