不使用观察者模式 构造一个价格读取器,当价格变化时,自动通知邮箱价格监视器和短信价格监视器
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();
确定很明确: 有多少观察者就要在被观察者里面加上多少,代码耦合在一起。
使用观察者模式 创建两个接口 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 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 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 () { foreach (var observer in _observers) { observer.Update(_price); } } public void ReadPrice () { _price = new Random().Next(1 , 1000 ); NotifyObservers(); } }
测试 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();