编辑
2025-09-28
C#
00

目录

摘要
正文
观察者模式的结构
观察者模式的应用场景
消息订阅与发布
股票行情通知
游戏事件通知
例子
总结

摘要

观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时,它的所有观察者都会收到通知并自动更新。

正文

观察者模式的结构

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

  • 主题(Subject):被观察的对象,它包含了观察者对象的集合,并提供了添加、删除和通知观察者的方法。
  • 观察者(Observer):观察主题对象的变化,并根据变化做出相应的处理。
  • 具体主题(Concrete Subject):实现主题接口,负责维护观察者对象的集合,并在状态变化时通知观察者。
  • 具体观察者(Concrete Observer):实现观察者接口,负责接收主题对象的通知,并根据通知做出相应的处理。

观察者模式的应用场景

观察者模式适用于以下情况:

  • 当一个对象的状态变化需要通知其他对象,并且不希望对象之间产生紧耦合关系时,可以使用观察者模式。
  • 当一个对象需要将自己的变化通知给其他对象,并且不知道这些对象是谁时,可以使用观察者模式。
  • 当一个对象需要将自己的变化通知给一组对象,并且这组对象需要根据变化做出不同的处理时,可以使用观察者模式。

以下是一些可能的应用场景:

消息订阅与发布

在一个消息订阅与发布系统中,可以使用观察者模式来实现消息的订阅和发布。主题对象负责维护订阅者列表,并在消息发布时通知所有订阅者。

股票行情通知

在一个股票交易系统中,可以使用观察者模式来实现股票行情的实时通知。主题对象负责维护股票行情,并在行情变化时通知所有观察者。

游戏事件通知

在一个游戏中,可以使用观察者模式来实现游戏事件的通知。主题对象负责维护游戏事件,并在事件发生时通知所有观察者。

例子

我们需要定义一个观察者接口IObserver,其中包含接收通知并做出处理的方法:

C#
public interface IObserver { void Update(); }

我们有一个名为Subject的主题接口,其中包含添加、删除和通知观察者的方法:

C#
public interface ISubject { void Attach(IObserver observer); void Detach(IObserver observer); void Notify(); }

我们可以创建一个具体主题类ConcreteSubject,实现ISubject接口,并在其中维护一个观察者对象的集合,并在状态变化时通知观察者:

C#
public class ConcreteSubject : ISubject { private List<IObserver> _observers = new List<IObserver>(); private string _state; public string State { get { return _state; } set { _state = value; Notify(); } } public void Attach(IObserver observer) { _observers.Add(observer); } public void Detach(IObserver observer) { _observers.Remove(observer); } public void Notify() { foreach (var observer in _observers) { observer.Update(); } } }

我们可以创建一个具体观察者类ConcreteObserver,实现IObserver接口,并在Update()方法中做出具体的处理逻辑:

C#
public class ConcreteObserver : IObserver { private string _name; private ConcreteSubject _subject; public ConcreteObserver(string name, ConcreteSubject subject) { _name = name; _subject = subject; } public void Update() { Console.WriteLine($"{_name} received notification: {_subject.State}"); } }

我们可以在客户端代码中使用观察者模式来实现主题和观察者之间的通信:

C#
static void Main(string[] args) { var subject = new ConcreteSubject(); var observer1 = new ConcreteObserver("Observer 1", subject); var observer2 = new ConcreteObserver("Observer 2", subject); subject.Attach(observer1); subject.Attach(observer2); subject.State = "State 1"; subject.State = "State 2"; subject.Detach(observer2); subject.State = "State 3"; }

image.png

总结

观察者模式是一种实现对象之间松耦合关系的有效方式,它能够提供一种简单而灵活的通信机制。通过使用观察者模式,可以实现对象之间的动态关联,并且能够在运行时动态添加和删除观察者。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!