一、生活中的观察者模式
比如我们使用的微信订阅号,关注订阅号的就是观察者,在订阅号上发布信息的就是发布者(主题对象),还有微博、qq关注好友等这些都是观察者模式的应用,只要主题对象发生了变化,观察者就会得知变化。
二、观察者模式
1、观察者模式定义
在生活中,只要有关注了订阅号客户端,如果订阅号有什么更新,就是直接推送给订阅了的用户;
观察者模式是一种一对多的依赖关系,一个主题对象被多个观察者对象同时监听,主题对象的状态发生变化时,会通知所有的观察者对象,使它们自动更新自己的行为。
2、观察者模式者的角色
抽象主题:主要是把所有观察者需要的引用汇集在一起,每个主题都有多个观察者,抽象主题提供一个接口,可以增加和删除观察者对象
具体主题:将具体主题的状态存入到具体的观察者对象,具体主题对象状态变更时,通知所有注册的观察者对象
抽象观察者:为所有具体观察者定义一个接口,主题对象发出通知时更新具体观察者对象。
具体观察者:主要实现抽象观察者的接口,以便主题对象发出通知时,本身能够更新状态,与主题对象协调一致。
3、关键点
(1)定义观察者和被观察者接口,有利于各自的扩展
(2)重要的被观察者(主题对象):定义观察者列表,以及观察者的添加和删除
定义通知观察者的方法,主题对象状态发生改变时通知观察者更新
4、代码
主题对象接口:
/// <summary>
/// 发布者接口
/// </summary>
public interface ISubject
{
void AddObserver(IObserver observer); //添加观察者
void RemoveObserver(IObserver observer);//移除观察者
void Nodify();//通知观察者的方法
}
具体主题对象:
public class Subject : ISubject
{
//用于保存订阅者的列表
private List<IObserver> observers = new List<IObserver>();
public string Msg { get; set; }
public string Name { get; set; }
public Subject(string name, string Msg)
{
this.Name = name;
this.Msg = Msg;
}
public void AddObserver(ObserverDemo.IObserver observer)
{
observers.Add(observer);
}
public void RemoveObserver(ObserverDemo.IObserver observer)
{
observers.Remove(observer);
}
public void Nodify()
{
if (observers != null && observers.Count > 0)
{
//通知所有订阅者
foreach (IObserver observer in observers)
{
if(observer!=null)
observer.Update(this);
}
}
}
}
观察者接口:
/// <summary>
/// 订阅者接口
/// </summary>
public interface IObserver
{
void Update(Subject subject);
}
具体观察者:
public class Observer : IObserver
{
private string Name;
public Observer(string name)
{
this.Name = name;
}
public void Update(Subject subject)
{
Console.WriteLine("用户:{0},【{1}】发来信息:{2}",Name,subject.Name,subject.Msg);
}
}
private void button1_Click(object sender, EventArgs e)
{
ISubject subject = new Subject("巴士公交","办卡9折优惠");
ISubject subject1 = new Subject("Linux学习","暑假班报名啦。。。。");
subject.AddObserver(new Observer("zhouyao"));
subject1.AddObserver(new Observer("zhouyao"));
subject.AddObserver(new Observer("小鱼"));
subject.Nodify();
subject1.Nodify();
Console.ReadKey();
}
观察者模式在生活中到处常见。