观察者模式详解

观察者模式详解

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

相关推荐
绿豆人14 小时前
Go设计模式学习
学习·设计模式·golang
逮到647了16 小时前
23种设计模式简述
设计模式
爱吃烤鸡翅的酸菜鱼17 小时前
【Java】封装位运算通用工具类——用一个整数字段替代几十个布尔列,极致节省存储空间
java·开发语言·设计模式·工具类·位运算·合成复用原则
geovindu18 小时前
go: Model,Interface,DAL ,Factory,BLL using mysql
开发语言·mysql·设计模式·golang·软件构建
guojb82419 小时前
当 Vue 3 遇上桥接模式:手把手教你优雅剥离虚拟滚动的业务大泥球
vue.js·设计模式
我登哥MVP19 小时前
【Spring6笔记】 - 15 - Spring中的八大设计模式
java·spring boot·笔记·spring·设计模式·intellij-idea
无籽西瓜a20 小时前
【西瓜带你学设计模式 | 第十六期 - 迭代器模式】迭代器模式 —— 统一遍历实现、优缺点与适用场景
java·后端·设计模式·迭代器模式·软件工程
程序员小寒21 小时前
JavaScript设计模式(十):模板方法模式实现与应用
前端·javascript·设计模式·模板方法模式
likerhood21 小时前
关于三种工厂的设计模式总结
设计模式
榴莲omega21 小时前
第14天:React 工程化与设计模式
前端·react.js·设计模式