C#观察者模式详解:实时通知与应用实例

0 下载量 147 浏览量 更新于2024-08-30 收藏 85KB PDF 举报
"C#观察者模式实例介绍" 观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象(被观察者)的状态发生改变时,所有依赖于它的对象(观察者)都能得到通知并自动更新。这种模式适用于那些需要处理大量对象之间复杂交互的场景,尤其是当一个对象的变化可能会影响到多个其他对象,但具体数量不固定的情况下。 在C#中,观察者模式通常通过以下几个步骤实现: 1. 定义观察者接口: 抽象类`Observer`是观察者模式的核心,它包含了观察者的基本行为。在这个例子中,抽象方法`Update()`定义了当被观察者状态变化时观察者需要执行的操作。例如: ```csharp abstract class Observer { protected string name; protected ISubject sub; public Observer(string name, ISubject sub) { this.name = name; this.sub = sub; } public abstract void Update(); } ``` 2. 创建具体观察者: 具体的观察者类(如`NBAObserver`和`StockObserver`)继承自`Observer`,实现`Update()`方法来响应不同的观察事件。例如,`NBAObserver`关闭NBA直播,而`StockObserver`可能执行股票相关的操作。 ```csharp // 使用面向对象的方式实现 class NBAObserver : Observer { // ... public override void Update() { Console.WriteLine($"{sub.SubjectState} {name}关闭NBA直播,继续工作!"); } } class StockObserver : Observer { // ... public override void Update() { // 实现股票操作逻辑... } } ``` 3. 定义被观察者接口: 被观察者接口(如`ISubject`或`ISubject2`)包含状态和通知观察者的方法。这里没有直接给出,但通常包括一个`Subscribe`方法用于添加观察者,以及一个`Unsubscribe`方法用于移除观察者。当主体状态改变时,调用`NotifyObservers()`方法通知所有已订阅的观察者。 ```csharp interface ISubject { event Action SubjectStateChanged; void Subscribe(Observer observer); void Unsubscribe(Observer observer); string SubjectState { get; set; } } ``` 4. 建立关联和通信: 在实际应用中,被观察者对象维护一个观察者列表,并在状态改变时触发`SubjectStateChanged`事件,通知所有订阅的观察者。例如: ```csharp class Subject : ISubject { private List<Observer> observers = new List<Observer>(); // ... public void NotifyObservers() { SubjectStateChanged?.Invoke(); } // 添加/移除观察者 public void Subscribe(Observer observer) { observers.Add(observer); } public void Unsubscribe(Observer observer) { observers.Remove(observer); } } ``` 5. 使用场景: 例如,在工作中,当老板回到办公室(主体)时,他可以调用`NotifyObservers()`,这样所有已订阅的员工(观察者)如看NBA直播的同事和看股票的同事都会收到通知,关闭他们的娱乐活动,进入工作状态。 通过C#观察者模式的实施,对象之间的依赖关系变得清晰且松耦合,当主体状态改变时,只需要维护好通知机制,就能确保所有相关观察者得到及时的更新。这在需要处理动态变化的系统中,如实时应用程序或事件驱动编程中,是非常有用的。