观察者的定义:观察者模式(又被称为发布-订阅模式),属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。
使用场景:
A对象(观察者)对B对象(被观察者)的某种变化高度敏感,需要在B变化的一瞬间做出反应。举个例子,新闻里喜闻乐见的警察抓小偷,警察需要在小偷伸手作案的时候实施抓捕。在这个例子里,警察是观察者、小偷是被观察者,警察需要时刻盯着小偷的一举一动,才能保证不会错过任何瞬间。程序里的观察者和这种真正的【观察】略有不同,观察者不需要时刻盯着被观察者(例如A不需要每隔1ms就检查一次B的状态),二是采用注册(Register)或者成为订阅(Subscribe)的方式告诉被观察者:我需要你的某某状态,你要在它变化时通知我。采取这样被动的观察方式,既省去了反复检索状态的资源消耗,也能够得到最高的反馈速度。
代码走起:
例如在商城购买产品的时候每当下单成功以后,商城都会发送短信/站内信给工作销售人员和购买人员通知产品销售情况。
抽象类:产品抽象类
public interface ISubject
{
void ChangOrderState(string title);
}
产品实现类:
public class ConcreteSubject : ISubject
{
/// <summary>
/// 观察者列表
/// </summary>
public List<IObserver> ObjectList = null;
/// <summary>
/// 生成实体subject的时候就会生成观察者列表
/// </summary>
/// <param name="objects"></param>
public ConcreteSubject(List<IObserver> objects)
{
this.ObjectList = objects;
}
/// <summary>
/// 订单状态发生改变
/// </summary>
/// <param name="title"></param>
public void ChangOrderState(string title)
{
Console.WriteLine(title);
SendSmsNotify();
}
/// <summary>
/// 将消息通知观察者
/// </summary>
public void SendSmsNotify()
{
ObjectList.ForEach(x => { x.ReceptSubjctMessage(); });
}
static void Main(string[] arge)
{
List<IObserver> observerList = new List<IObserver>()
{
new SmsNotifyToCustomer(),
new SmsNotifyToProdctAdmintrator()
};
ISubject subject = new ConcreteSubject(observerList);
subject.ChangOrderState("产品状态变化了啊;我要发送购买短信给顾客,也要发送售卖成功短信给产品管理员啦");
Console.ReadLine();
}
}
短信通知抽象类:
public interface IObserver
{
void ReceptSubjctMessage();
}
短信通知顾客类
public class SmsNotifyToCustomer:IObserver
{
public void ReceptSubjctMessage()
{
Console.WriteLine("短信通知顾客购买成功提示");
}
}
短信通知产品管理员类:
public class SmsNotifyToProdctAdmintrator : IObserver
{
public void ReceptSubjctMessage()
{
Console.WriteLine($"恭喜您,您的产品售卖成功");
}
}