在软件设计中,观察者模式是一种常见的设计模式,它属于行为型模式,主要用于建立一种一对多的关系,使得一个对象(被观察者)状态的变化能够自动通知所有依赖于它的对象(观察者)。在本篇教程中,我们将探讨如何在C#中实现观察者模式,并通过具体的示例代码进行说明。
观察者模式的基本概念
在观察者模式中,核心组件包含以下几个角色:
- Subject(被观察者):在状态变化时通知观察者的对象。
- Observer(观察者):需要被通知并进行相应更新的对象。
- ConcreteSubject(具体被观察者):实现了
Subject
接口的具体类。
- ConcreteObserver(具体观察者):实现了
Observer
接口的具体类。
这种模式的优点在于它实现了对象间的解耦,允许动态添加和删除观察者。
使用C#实现观察者模式
示例场景
假设我们在开发一个股票行情监控系统,Stock
类作为被观察者,而多个Investor
类作为观察者,他们能够实时接收股票价格的变动。
步骤一:定义观察者接口
首先,我们定义一个 IObserver
接口,它包含一个更新方法,用于当被观察者状态变化时通知观察者。
1 2 3 4
| public interface IObserver { void Update(string stockSymbol, decimal price); }
|
步骤二:定义被观察者接口
接着,我们定义一个 ISubject
接口,用于管理观察者的添加和移除,以及通知观察者。
1 2 3 4 5 6
| public interface ISubject { void Attach(IObserver observer); void Detach(IObserver observer); void Notify(); }
|
步骤三:实现具体被观察者类
现在我们实现一个具体的被观察者类 Stock
,它包含股票符号和价格,并能够在价格变化时通知所有观察者。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| using System; using System.Collections.Generic;
public class Stock : ISubject { private string _symbol; private decimal _price; private readonly List<IObserver> _observers = new List<IObserver>();
public Stock(string symbol, decimal price) { _symbol = symbol; _price = price; }
public string Symbol => _symbol;
public decimal Price { get => _price; set { _price = 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(_symbol, _price); } } }
|
步骤四:实现具体观察者类
接下来,我们实现一个具体的观察者类 Investor
,它实现了 IObserver
接口,并在 Update
方法中接收被观察者的通知。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class Investor : IObserver { private string _name;
public Investor(string name) { _name = name; }
public void Update(string stockSymbol, decimal price) { Console.WriteLine($"投资者 {_name} 收到通知: 股票 {stockSymbol} 的新价格为 {price}"); } }
|
步骤五:演示观察者模式的应用
最后,在主程序中创建被观察者和观察者,并展示它们是如何协同工作的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Program { static void Main() { Stock stock = new Stock("AAPL", 150.00m);
Investor investor1 = new Investor("张三"); Investor investor2 = new Investor("李四");
stock.Attach(investor1); stock.Attach(investor2);
stock.Price = 155.00m; stock.Price = 160.00m;
stock.Detach(investor1); stock.Price = 162.00m; } }
|
输出结果
运行上述程序将输出:
1 2 3 4 5
| 投资者 张三 收到通知: 股票 AAPL 的新价格为 155.00 投资者 李四 收到通知: 股票 AAPL 的新价格为 155.00 投资者 张三 收到通知: 股票 AAPL 的新价格为 160.00 投资者 李四 收到通知: 股票 AAPL 的新价格为 160.00 投资者 李四 收到通知: 股票 AAPL 的新价格为 162.00
|
小结
本篇文章详细讲解了 观察者模式
在 C# 中的应用。通过股票行情监控的案例,我们实现了被观察者和观察者的类,并演示了它们之间如何进行通信。观察者模式为我们提供了一个灵活的解决方案,使得对象之间的耦合度降低,从而可更好地管理代码的复杂性。
在下一篇教程中,我们将讨论 装饰者模式,继续扩展我们的设计模式系列。请继续关注!