24 在C#中应用观察者模式

在软件设计中,观察者模式是一种常见的设计模式,它属于行为型模式,主要用于建立一种一对多的关系,使得一个对象(被观察者)状态的变化能够自动通知所有依赖于它的对象(观察者)。在本篇教程中,我们将探讨如何在C#中实现观察者模式,并通过具体的示例代码进行说明。

观察者模式的基本概念

在观察者模式中,核心组件包含以下几个角色:

  1. Subject(被观察者):在状态变化时通知观察者的对象。
  2. Observer(观察者):需要被通知并进行相应更新的对象。
  3. ConcreteSubject(具体被观察者):实现了Subject接口的具体类。
  4. 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# 中的应用。通过股票行情监控的案例,我们实现了被观察者和观察者的类,并演示了它们之间如何进行通信。观察者模式为我们提供了一个灵活的解决方案,使得对象之间的耦合度降低,从而可更好地管理代码的复杂性。

在下一篇教程中,我们将讨论 装饰者模式,继续扩展我们的设计模式系列。请继续关注!

24 在C#中应用观察者模式

https://zglg.work/csharp-one/24/

作者

IT教程网(郭震)

发布于

2024-08-13

更新于

2024-08-13

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论