觀察者模式
當對象間存在一對多關係時,則使用觀察者模式(Observer Pattern)。比如,當一個對象被修改時,則會自動通知依賴它的對象。觀察者模式屬於行爲型模式。
介紹
意圖:定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新。
主要解決:一個對象狀態改變給其他對象通知的問題,而且要考慮到易用和低耦合,保證高度的協作。
何時使用:一個對象(目標對象)的狀態發生改變,所有的依賴對象(觀察者對象)都將得到通知,進行廣播通知。
如何解決:使用面向對象技術,可以將這種依賴關係弱化。
關鍵代碼:在抽象類裏有一個 ArrayList 存放觀察者們。
class Program
{
// 委託充當訂閱者接口類
public delegate void NotifyEventHandler(object sender);
// 抽象訂閱號類
public class Blog
{
public NotifyEventHandler NotifyEvent;
public string Symbol { get; set; }//描寫訂閱號的相關信息
public string Info { get; set; }//描寫此次update的信息
public Blog(string symbol, string info)
{
this.Symbol = symbol;
this.Info = info;
}
#region 新增對訂閱號列表的維護操作
public void AddObserver(NotifyEventHandler ob)
{
NotifyEvent += ob;
}
public void RemoveObserver(NotifyEventHandler ob)
{
NotifyEvent -= ob;
}
#endregion
public void Update()
{
if (NotifyEvent != null)
{
NotifyEvent(this);
}
}
}
// 具體訂閱號類
public class MyBlog : Blog
{
public MyBlog(string symbol, string info)
: base(symbol, info)
{
}
}
// 具體訂閱者類
public class Subscriber
{
public string Name { get; set; }
public Subscriber(string name)
{
this.Name = name;
}
public void Receive(Object obj)
{
Blog xmfdsh = obj as Blog;
if (xmfdsh != null)
{
Console.WriteLine("訂閱者 {0} 觀察到了{1}{2}", Name, xmfdsh.Symbol, xmfdsh.Info);
}
}
}
static void Main1(string[] args)
{
Blog xmfdsh = new MyBlog("xmfdsh", "發佈了一篇新博客");
Subscriber wnm = new Subscriber("王尼瑪");
Subscriber tmr = new Subscriber("唐馬儒");
Subscriber wmt = new Subscriber("王蜜桃");
Subscriber anm = new Subscriber("敖尼瑪");
// 添加訂閱者
xmfdsh.AddObserver(new NotifyEventHandler(wnm.Receive));
xmfdsh.AddObserver(new NotifyEventHandler(tmr.Receive));
xmfdsh.AddObserver(new NotifyEventHandler(wmt.Receive));
xmfdsh.AddObserver(new NotifyEventHandler(anm.Receive));
xmfdsh.Update();
Console.WriteLine();
Console.WriteLine();
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("移除訂閱者王尼瑪");
xmfdsh.RemoveObserver(new NotifyEventHandler(wnm.Receive));
xmfdsh.Update();
Console.ReadLine();
}
}
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/s8MAa2Fq8tR3QbnAwGtNFg