极速理解设计模式系列:2.观察者模式(Observer Pattern)
4個角色:被觀察者(Subject/目標(biāo)對象接口),具體被觀察者(ConcreteSubject/具體目標(biāo)對象),觀察者(Observer),具體觀察者(ConcreteObserver)
?????????????被觀察者(Subject/目標(biāo)對象接口):目標(biāo)對象的抽象接口
???????具體被觀察者(ConcreteSubject/具體目標(biāo)對象):目標(biāo)對象的具體實現(xiàn),能夠添加、刪除具體對象并且通知所有的觀察者對象。
???????觀察者:觀察到目標(biāo)對象的動作的時候有所反應(yīng)的接口
?????? 具體觀察者:觀察者對象的具體實現(xiàn),并且有相關(guān)動作。
???????? 實現(xiàn)思路:客戶端創(chuàng)建目標(biāo)對象,目標(biāo)對象添加所有的觀察者對象,然后目標(biāo)對象更新,所有的觀察者對象產(chǎn)生反應(yīng)。
?類圖:???????
??????? 應(yīng)用場景:在Silverlight的某個系統(tǒng)中我們需要做一個消息通知管理,當(dāng)接收到消息的時候,系統(tǒng)右下角彈出一個Tip窗口通知有消息,在系統(tǒng)的右上角出現(xiàn)一個短消息的圖標(biāo)開始閃亮表示有新消息。
??????? 分析:在這里消息是一個類作為目標(biāo)對象,而Tip窗口是另外一個類作為一個觀察者;右上角的圖標(biāo)也是另外一個類,它控制圖標(biāo)是否閃亮,作為另外一個觀察者。當(dāng)消息出現(xiàn)的時候,通知兩個觀察者開始動作。
??????? 下面我們在控制臺程序去演示一下如何使用Observer Pattern:
??????? 一、被觀察者(Subject/目標(biāo)對象接口)
/// <summary>/// 需要被觀察的對象:目標(biāo)對象
/// </summary>
interface IMsg
{
void AddObserver(IObs obs);
void RemoveObserver(IObs obs);
void Notify();
}
??????? 二、具體被觀察者(ConcreteSubject/具體目標(biāo)對象)
/// <summary>/// 信息類
/// </summary>
class MsgClass:IMsg
{
List<IObs> ObsList = new List<IObs>();
/// <summary>
/// 添加觀察者
/// </summary>
/// <param name="obs"></param>
public void AddObserver(IObs obs)
{
ObsList.Add(obs);
}
/// <summary>
/// 移出觀察者列表
/// </summary>
/// <param name="obs"></param>
public void RemoveObserver(IObs obs)
{
ObsList.Remove(obs);
}
/// <summary>
/// 通知觀察者
/// </summary>
public void Notify()
{
Console.WriteLine("在這里目標(biāo)對象屬性變化");
foreach (IObs o in ObsList)
{ o.Active(); }
}
}
??????? 三、觀察者(Observer)
/// <summary>/// 觀察者
/// </summary>
interface IObs
{
void Active();
}
??????? 四、具體觀察者(ConcreteObserver)
class ObsTipShowMsg : IObs{
public void Active()
{
Console.WriteLine("通過TipMessage的方式顯示新信息");
}
}
class ObsLightShowMsg : IObs
{
public void Active()
{
Console.WriteLine("通過圖標(biāo)閃動方式通知新信息");
}
}
??????? 五、客戶端
class Program{
static void Main(string[] args)
{
MsgClass msg = new MsgClass();
ObsTipShowMsg tipShowMsg = new ObsTipShowMsg();
ObsLightShowMsg lightShowMsg = new ObsLightShowMsg();
msg.AddObserver(tipShowMsg);
msg.AddObserver(lightShowMsg);
msg.Notify();
Console.ReadLine();
}
}
??????? 如需源碼請點擊 ObserverPattern.rar?下載。
轉(zhuǎn)載于:https://www.cnblogs.com/chengxingliang/archive/2011/08/22/2147142.html
總結(jié)
以上是生活随笔為你收集整理的极速理解设计模式系列:2.观察者模式(Observer Pattern)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: hdu 1671
- 下一篇: Dave Python 练习三 --
