观察者模式
定义了一种一对多的依赖关系,让多个观察者对象通俗监听某个主题对象,这个主题 对象在状态发生变化时,会通知所有观察者对象,使它们能自动更新自己
先来看一个例子,也就是说一个报纸厂商,最近为客户提供了一个新的功能,那就订阅,当某个主题的报纸更新时,厂商会派人为这些订阅的人送去报纸
class Theme//主题 { private List<INotify> Tobserver = new List<INotify>(); public void Notify() { foreach (var item in Tobserver) { item.Update("你就当我是一段文本内容"); } } public void AddObserver(INotify i) { Tobserver.Add(i); } public void RemoveObserver(INotify i) { Tobserver.Remove(i); } } interface INotify { void Update(string s); } class Observer : INotify//观察者 { private string Name; public Observer(string name) { this.Name = name; } public void Update(string s) { Console.WriteLine(s+":发送给\t\t"+this.Name); } }
在这里呢,因为只是一个简单的演示,所以说,并没有创建观察者抽象类和主题抽象类,毕竟用到的时候在写嘛,不要对未知的东西去猜测
static void Main(string[] args) { Theme th = new Theme(); Observer o1 = new Observer("小明"); Observer o2 = new Observer("小白"); th.AddObserver(o1); th.AddObserver(o2); th.Notify(); Console.Read(); }
当然这样子的观察者模式是不完整的,或者说不好的,主要问题为:并不是每个订阅的用户都需要在刚发布的时候得到,也就是说需要为观察者添加一个pull(拉)的方法
让观察者来决定什么时候获取主题消息!!
class Theme//主题 { private List<INotify> Tobserver = new List<INotify>(); private string currentStr=string.Empty; public string CurrentStr { get { if (currentStr == string.Empty) { return "对不起当前没有订阅主题"; } else return currentStr; } set { currentStr = value; this.Notify(); } } public void Notify() { foreach (var item in Tobserver) { item.Update(CurrentStr); } } public void AddObserver(INotify i) { Tobserver.Add(i); i.addPull(this); } public void RemoveObserver(INotify i) { Tobserver.Remove(i); } } interface INotify { void Update(string s); void addPull(Theme t); } class Observer : INotify//观察者 { private Theme th = null; private string Name; public Observer(string name) { this.Name = name; } public void Update(string s) { Console.WriteLine(s+":发送给\t\t"+this.Name); } public void addPull(Theme t) { this.th=t; } public void Pull() { Console.WriteLine("姓名:{0}\t这个是我拉取出来的\t{1}",this.Name,th.CurrentStr); } }
static void Main(string[] args) { Theme th = new Theme(); Observer o1 = new Observer("小明"); Observer o2 = new Observer("小白"); th.AddObserver(o1); th.AddObserver(o2); th.Notify(); th.CurrentStr = "最新科幻片0-0"; o1.Pull(); Console.Read(); }
Hold on, everything is possible.