标签:
观察者模式也叫发布-订阅模式。
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象,这个主题对象状态发生状态变化时,会通知所有的观察者对象,使它们能够自动更新自己。
什么时候使用观察者模式?
当一个对象的改变需要同时改变其他对象的时候。
using System; using System.Collections.Generic; using System.Text; namespace 观察者模式 { class Program { static void Main(string[] args) { //老板胡汉三 Boss huhansan = new Boss(); //看股票的同事 StockObserver tongshi1 = new StockObserver("李哲", huhansan); //看NBA的同事 NBAObserver tongshi2 = new NBAObserver("李明", huhansan); huhansan.Attach(tongshi1); huhansan.Attach(tongshi2); huhansan.Detach(tongshi1); //老板回来 huhansan.SubjectState = "我胡汉回来了!"; //发出通知 huhansan.Notify(); Console.Read(); } } //通知者接口 interface Subject { void Attach(Observer observer); void Detach(Observer observer); void Notify(); string SubjectState { get; set; } } class Secretary : Subject { //同事列表 private IList<Observer> observers = new List<Observer>(); private string action; //增加 public void Attach(Observer observer) { observers.Add(observer); } //减少 public void Detach(Observer observer) { observers.Remove(observer); } //通知 public void Notify() { foreach (Observer o in observers) o.Update(); } //前台状态 public string SubjectState { get { return action; } set { action = value; } } } class Boss : Subject { //同事列表 private IList<Observer> observers = new List<Observer>(); private string action; //增加 public void Attach(Observer observer) { observers.Add(observer); } //减少 public void Detach(Observer observer) { observers.Remove(observer); } //通知 public void Notify() { foreach (Observer o in observers) o.Update(); } //老板状态 public string SubjectState { get { return action; } set { action = value; } } } //抽象观察者 abstract class Observer { protected string name; protected Subject sub; public Observer(string name, Subject sub) { this.name = name; this.sub = sub; } public abstract void Update(); } //看股票的同事 class StockObserver : Observer { public StockObserver(string name, Subject sub) : base(name, sub) { } public override void Update() { Console.WriteLine("{0} {1} 关闭股票行情,继续工作!", sub.SubjectState, name); } } //看NBA的同事 class NBAObserver : Observer { public NBAObserver(string name, Subject sub) : base(name, sub) { } public override void Update() { Console.WriteLine("{0} {1} 关闭NBA直播,继续工作!", sub.SubjectState, name); } } }
上面代码中,抽象通知者依赖抽象观察者,而且观察者的方法都是同名的Update(),如果说观察者都有各自不同名的方法,这里用到了事件委托实现抽象通知者对抽象观察者的依赖,同时也不需要观察者都是通用Update()方法了。
由于抽象通知者不希望依赖抽象观察者了,所以“增加”,“减少”观察者的方法也是不需要了。
using System; using System.Collections.Generic; using System.Text; namespace 观察者模式 { class Program { static void Main(string[] args) { //老板胡汉 Boss huhansan = new Boss(); //看股票的同事 StockObserver tongshi1 = new StockObserver("李哲", huhansan); //看NBA的同事 NBAObserver tongshi2 = new NBAObserver("李明", huhansan); huhansan.Update += new EventHandler(tongshi1.CloseStockMarket); huhansan.Update += new EventHandler(tongshi2.CloseNBADirectSeeding); //老板回来 huhansan.SubjectState = "我胡汉回来了!"; //发出通知 huhansan.Notify(); Console.Read(); } } //通知者接口 interface Subject { void Notify(); string SubjectState { get; set; } } //事件处理程序的委托 delegate void EventHandler(); class Secretary : Subject { //声明一事件Update,类型为委托EventHandler public event EventHandler Update; private string action; public void Notify() { Update(); } public string SubjectState { get { return action; } set { action = value; } } } class Boss : Subject { //声明一事件Update,类型为委托EventHandler public event EventHandler Update; private string action; public void Notify() { Update(); } public string SubjectState { get { return action; } set { action = value; } } } //看股票的同事 class StockObserver { private string name; private Subject sub; public StockObserver(string name, Subject sub) { this.name = name; this.sub = sub; } //关闭股票行情 public void CloseStockMarket() { Console.WriteLine("{0} {1} 关闭股票行情,继续工作!", sub.SubjectState, name); } } //看NBA的同事 class NBAObserver { private string name; private Subject sub; public NBAObserver(string name, Subject sub) { this.name = name; this.sub = sub; } //关闭NBA直播 public void CloseNBADirectSeeding() { Console.WriteLine("{0} {1} 关闭NBA直播,继续工作!", sub.SubjectState, name); } } }
标签:
原文地址:http://www.cnblogs.com/kesimin/p/4843104.html