观察者模式详解

观察者模式详解

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

相关推荐
黑不溜秋的9 分钟前
C++ 设计模式 - 策略模式
c++·设计模式·策略模式
付聪12102 小时前
策略模式介绍和代码示例
设计模式
ThereIsNoCode4 小时前
「软件设计模式」状态模式(State)
设计模式·状态模式
菜鸟一枚在这10 小时前
深入理解设计模式之代理模式
java·设计模式·代理模式
mjr11 小时前
设计模式-Java
java·设计模式
yuanpan12 小时前
23种设计模式之《组合模式(Composite)》在c#中的应用及理解
开发语言·设计模式·c#·组合模式
FLZJ_KL14 小时前
【设计模式】【创建型模式】单例模式(Singleton)
java·单例模式·设计模式
万兴丶16 小时前
Unity 适用于单机游戏的红点系统(前缀树 | 数据结构 | 设计模式 | 算法 | 含源码)
数据结构·unity·设计模式·c#
菜鸟一枚在这16 小时前
深入剖析抽象工厂模式:设计模式中的架构利器
设计模式·架构·抽象工厂模式
码熔burning16 小时前
(三)趣学设计模式 之 抽象工厂模式!
设计模式·抽象工厂模式