.Net行为型设计模式之观察者模式(Observer)
观察者模式(Observer),是一种行为型设计模式,它定义对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。观察者模式中的被观察者和观察者之间是松耦合的,它们之间没有直接的耦合关系,而是通过抽象化的通知来进行交互。
观察者模式中主要有以下角色:
- Subject(被观察者):被观察者是具体的被观察者对象,它维护着一个观察者列表,提供注册、删除和通知等方法。
- Observer(观察者):观察者是具体的观察者对象,每个观察者都会对被观察者的变化做出响应。
- ConcreteSubject(具体被观察者):具体被观察者是被观察者角色的实现,它会向观察者广播事件,实现通知的具体逻辑。
- ConcreteObserver(具体观察者):具体观察者是观察者角色的实现,它会根据被观察者的事件来做出响应。
示例1
下面是一个简单的示例,以模拟一个电商网站中最近活动的商品为例。具体被观察者为Goods类,具体观察者为User类。
public interface IGoods
{
void RegisterObserver(IObserver observer);
void RemoveObserver(IObserver observer);
void NotifyObservers();
}
public class Goods : IGoods
{
private readonly List<IObserver> _observers = new List<IObserver>();
private string _name;
private double _price;
public Goods(string name, double price)
{
_name = name;
_price = price;
}
public void SetPrice(double price)
{
if (price != _price)
{
_price = price;
NotifyObservers();
}
}
public void RegisterObserver(IObserver observer)
{
if (!_observers.Contains(observer))
{
_observers.Add(observer);
}
}
public void RemoveObserver(IObserver observer)
{
if (_observers.Contains(observer))
{
_observers.Remove(observer);
}
}
public void NotifyObservers()
{
foreach (var observer in _observers)
{
observer.Update(_name, _price);
}
}
}
public interface IObserver
{
void Update(string name, double price);
}
public class User : IObserver
{
private readonly string _name;
private double _maxPrice;
public User(string name, double maxPrice)
{
_name = name;
_maxPrice = maxPrice;
}
public void Update(string name, double price)
{
if (price > _maxPrice)
{
Console.WriteLine($"{_name}收到了{price.ToString("C2")}元的{name}商品促销通知。");
}
}
public void SetMaxPrice(double maxPrice)
{
_maxPrice = maxPrice;
}
}
示例2
下面是一个更加具体的示例,以模拟一个股票行情的观察者模式为例。具体被观察者为Stock类,具体观察者为Investor类。
public interface IStock
{
void RegisterObserver(IObserver observer);
void RemoveObserver(IObserver observer);
void NotifyObservers();
}
public class Stock : IStock
{
private readonly List<IObserver> _observers = new List<IObserver>();
private string _name;
private double _price;
public Stock(string name, double price)
{
_name = name;
_price = price;
}
public void SetPrice(double price)
{
if (price != _price)
{
_price = price;
NotifyObservers();
}
}
public void RegisterObserver(IObserver observer)
{
if (!_observers.Contains(observer))
{
_observers.Add(observer);
}
}
public void RemoveObserver(IObserver observer)
{
if (_observers.Contains(observer))
{
_observers.Remove(observer);
}
}
public void NotifyObservers()
{
foreach (var observer in _observers)
{
observer.Update(_name, _price);
}
}
}
public interface IObserver
{
void Update(string name, double price);
}
public class Investor : IObserver
{
private readonly string _name;
public Investor(string name)
{
_name = name;
}
public void Update(string name, double price)
{
Console.WriteLine($"{_name}收到了{name}股票的价格变化通知,当前价格为{price.ToString("C2")}元。");
}
}
以上是具体实现示例的代码。在示例1中,具体被观察者为Goods类,具体观察者为User类。具体被观察者通过维护一个观察者们的列表来实现注册观察者、删除观察者、通知观察者等方法,并通过NotifyObservers()方法广播消息。具体观察者User类实现了IObserver接口,并实现了Update()方法。当具体被观察者Goods类的价格发生变化时,它就会向观察者们发送通知,观察者们便会根据自己的逻辑作出相应的操作,例如在本示例中,如果价格高于某个值,就会通知用户“xx收到了xx元的xx商品促销通知”。
在示例2中,具体被观察者为Stock类,具体观察者为Investor类。具体被观察者和具体观察者都是通过实现IStock和IObserver接口来实现注册观察者、删除观察者、通知观察者等方法,并通过NotifyObservers()方法广播消息。当具体被观察者Stock类的价格发生变化时,它就会向观察者们发送通知,观察者们便会根据自己的逻辑作出相应的操作,例如在本示例中,如果价格发生变化,就会通知投资者“xx收到了xx股票的价格变化通知,当前价格为xx元”。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.Net行为型设计模式之观察者模式(Observer) - Python技术站