在今天,读书有时是件“麻烦”事。它需要你付出时间,付出精力,还要付出一份心境。--仅以《大话设计模式》来祭奠那逝去的……
观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象发生变化时,会通知到所有观察者对象,使它们能自动更新自己
1.观察者模式应用
定义抽象通知者(主题)和抽象观察者,抽象通知者负责增加、移除和通知抽象观察者,抽象观察者得到通知的时候更新自己
/// <summary>
/// 主题或者抽象通知者
/// </summary>
public abstract class Subject
{
private IList<Observer> observers = new List<Observer>();
/// <summary>
/// 增加观察者
/// </summary>
public void Attach(Observer observer)
{
observers.Add(observer);
}
/// <summary>
/// 移除观察者
/// </summary>
/// <param name="observer"></param>
public void Detach(Observer observer)
{
observers.Remove(observer);
}
/// <summary>
/// 通知观察者
/// </summary>
public void Notify()
{
foreach (var v in observers)
{
v.Update();
}
}
}
/// <summary>
/// 抽象观察者(为所有具体观察者定义的一个接口,在得到主题通知时更新自己)
/// </summary>
public abstract class Observer
{
public abstract void Update();
}
定义具体通知者(主题)和具体观察者,具体观察者实现具体业务
/// <summary>
/// 具体主题或者通知者
/// </summary>
public class ConcreteSubject : Subject
{
public string SubjectState { get; set; }
}
/// <summary>
/// 具体观察者
/// </summary>
public class ConcreteObserver : Observer
{
private string _name;
public ConcreteSubject Subject { get; set; }
public ConcreteObserver(ConcreteSubject subject, string name)
{
this._name = name;
this.Subject = subject;
}
public override void Update()
{
Console.WriteLine("观察者{0}:通知者发来最新消息【{1}】", this._name, this.Subject.SubjectState);
}
}
开启场景模拟
static void Main(string[] args)
{
ConcreteSubject s = new ConcreteSubject();
s.Attach(new ConcreteObserver(s, "X"));
s.Attach(new ConcreteObserver(s, "Y"));
s.Attach(new ConcreteObserver(s, "Z"));
s.SubjectState = "ABC";
s.Notify();
}