观察者模式最简入门

观察者模式最简入门

不使用观察者模式

构造一个价格读取器,当价格变化时,自动通知邮箱价格监视器和短信价格监视器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//两个价格监视器
public class EmailPriceChangeNotifier()
{
public void Update(decimal currentPrice)
{
Console.WriteLine($"我是邮箱价格监视器,监视到当前价格为:{currentPrice};");
}
}
public class MsgPriceChangeNotifier
{
public void Update(decimal currentPrice)
{
Console.WriteLine($"我是短信价格监视器,监视到当前价格为:{currentPrice};");
}
}
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
//价格读取器
public class PriceReader
{
private decimal _price;

//被观察者需要将观察者加入
private EmailPriceChangeNotifier _emailPriceChangeNotifier;
private MsgPriceChangeNotifier _msgPriceChangeNotifier;

public PriceReader(
EmailPriceChangeNotifier emailPriceChangeNotifier,
MsgPriceChangeNotifier msgPriceChangeNotifier)
{
_emailPriceChangeNotifier = emailPriceChangeNotifier;
_msgPriceChangeNotifier = msgPriceChangeNotifier;
}


public void ReadPrice()
{
_price = new Random().Next(1, 1000);

//有多少观察者就通知多少
_emailPriceChangeNotifier.Update(_price);
_msgPriceChangeNotifier.Update(_price);
}
}
1
2
3
4
5
Console.WriteLine("开始测试");
var emailPriceChangeNotifier = new EmailPriceChangeNotifier();
var msgPriceChangeNotifier = new MsgPriceChangeNotifier();
var priceReader = new PriceReader(emailPriceChangeNotifier, msgPriceChangeNotifier);
priceReader.ReadPrice();

image-20250821111259694

确定很明确:有多少观察者就要在被观察者里面加上多少,代码耦合在一起。

使用观察者模式

  1. 创建两个接口
1
2
3
4
5
6
7
8
9
10
11
12
13
//观察者
public interface IObserver<T>
{
void Update(T data);
}
//被观察者
public interface IObservable<T>
{
void AttachObserver(IObserver<T> observer);
void DetachObserver(IObserver<T> observer);

void NotifyObservers();
}
  1. 观察者实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class EmailPriceChangeNotifier(): IObserver<decimal>
{
public void Update(decimal currentPrice)
{
Console.WriteLine($"我是邮箱价格监视器,监视到当前价格为:{currentPrice};");
}
}
public class MsgPriceChangeNotifier : IObserver<decimal>
{
public void Update(decimal currentPrice)
{
Console.WriteLine($"我是短信价格监视器,监视到当前价格为:{currentPrice};");
}
}
  1. 被观察者实现
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
public class PriceReader: IObservable<decimal>
{
private decimal _price;
//核心是搞一个列表
private List<IObserver<decimal>> _observers = new List<IObserver<decimal>>();

public void AttachObserver(IObserver<decimal> observer)
{
_observers.Add(observer);
}

public void DetachObserver(IObserver<decimal> observer)
{
_observers.Remove(observer);
}

public void NotifyObservers()
{
//遍历所有观察者,调用它们的Update方法
foreach (var observer in _observers)
{
observer.Update(_price);
}
}

public void ReadPrice()
{
_price = new Random().Next(1, 1000);
NotifyObservers(); //通知所有观察者
}
}
  1. 测试
1
2
3
4
5
6
7
Console.WriteLine("开始测试");
var priceReader = new PriceReader();
var emailPriceChangeNotifier = new EmailPriceChangeNotifier();
priceReader.AttachObserver(emailPriceChangeNotifier);
var msgPriceChangeNotifier = new MsgPriceChangeNotifier();
priceReader.AttachObserver(msgPriceChangeNotifier);
priceReader.ReadPrice();

image-20250821112706299

作者

步步为营

发布于

2025-08-21

更新于

2025-08-21

许可协议