观察者模式(Observer)
观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。
namespace ObserverPattern
{
//观察者模式 2017。09.16 09:36 added by longdb
/// <summary>
/// 主题类或者抽象通知者类
/// </summary>
abstract class Subject
{
private IList<Observer> observerlist = new List<Observer>();
/// <summary>
/// 增加观察者
/// </summary>
/// <param name="observer"></param>
public void Attach(Observer observer)
{
observerlist.Add(observer);
}
/// <summary>
/// 移除观察者
/// </summary>
/// <param name="observer"></param>
public void Detach(Observer observer)
{
observerlist.Remove(observer);
}
/// <summary>
/// 通知观察者。
/// </summary>
public void Notify()
{
foreach (var ob in observerlist)
{
ob.Update();
}
}
}
/// <summary>
/// 具体主题或者具体通知者。
/// 将有关状态存入具体观察者对象;
/// 在具体的主题的内部状态改变时,给所有登记过的观察者发出通知。
/// </summary>
class ConcreatSubject : Subject
{
private string subjectstate;
/// <summary>
/// 具体被观察者的对象。
/// </summary>
public string SubjectState
{
get { return subjectstate; }
set { subjectstate = value; }
}
}
/// <summary>
/// 抽象观察者类。
/// </summary>
abstract class Observer
{
public abstract void Update();
}
/// <summary>
/// 具体观察者,实现抽象观察者角色所有要求的更新接口,
/// 以便使本身的状态和主题的状态相协调。
/// </summary>
class ConcreatObserver : Observer
{
private string name;
private string observerState;
private ConcreatSubject subject;
public ConcreatObserver(ConcreatSubject subject,string name)
{
//构造器注入。
this.subject = subject;
this.name = name;
}
public override void Update()
{
observerState = subject.SubjectState;
Console.WriteLine("观察者{0}的新状态是{1}",name,observerState);
}
public ConcreatSubject Subject
{
get { return subject; }
set { subject = value; }
}
}
class Program
{
static void Main(string[] args)
{
ConcreatSubject sub = new ConcreatSubject();
sub.Attach(new ConcreatObserver(sub, "张三"));
sub.Attach(new ConcreatObserver(sub, "李四"));
sub.Attach(new ConcreatObserver(sub, "王五"));
sub.SubjectState = "abc";
sub.Notify();
Console.ReadKey();
}
}
}