设计模式二:观察者模式(Observer Pattern)

4个角色:被观察者(Subject/目标对象接口),具体被观察者(ConcreteSubject/具体目标对象),观察者(Observer),具体观察者(ConcreteObserver)
             被观察者(Subject/目标对象接口):目标对象的抽象接口

       具体被观察者(ConcreteSubject/具体目标对象):目标对象的具体实现,能够添加、删除具体对象并且通知所有的观察者对象。

       观察者:观察到目标对象的动作的时候有所反应的接口

       具体观察者:观察者对象的具体实现,并且有相关动作。
         实现思路:客户端创建目标对象,目标对象添加所有的观察者对象,然后目标对象更新,所有的观察者对象产生反应。

 类图:       


        应用场景:在Silverlight的某个系统中我们需要做一个消息通知管理,当接收到消息的时候,系统右下角弹出一个Tip窗口通知有消息,在系统的右上角出现一个短消息的图标开始闪亮表示有新消息。


        分析:在这里消息是一个类作为目标对象,而Tip窗口是另外一个类作为一个观察者;右上角的图标也是另外一个类,它控制图标是否闪亮,作为另外一个观察者。当消息出现的时候,通知两个观察者开始动作。

        下面我们在控制台程序去演示一下如何使用Observer Pattern:

        一、被观察者(Subject/目标对象接口)

复制代码
///<summary>
/// 需要被观察的对象:目标对象
///</summary>
interface IMsg
{
void AddObserver(IObs obs);
void RemoveObserver(IObs obs);
void Notify();
}
复制代码

        二、具体被观察者(ConcreteSubject/具体目标对象)

复制代码
///<summary>
/// 信息类
///</summary>
class MsgClass:IMsg
{
List
<IObs> ObsList =new List<IObs>();

///<summary>
/// 添加观察者
///</summary>
///<param name="obs"></param>
publicvoid AddObserver(IObs obs)
{
ObsList.Add(obs);
}

///<summary>
/// 移出观察者列表
///</summary>
///<param name="obs"></param>
publicvoid RemoveObserver(IObs obs)
{
ObsList.Remove(obs);
}

///<summary>
/// 通知观察者
///</summary>
publicvoid Notify()
{
Console.WriteLine(
"在这里目标对象属性变化");
foreach (IObs o in ObsList)
{ o.Active(); }
}
}
复制代码

        三、观察者(Observer)

复制代码
///<summary>
/// 观察者
///</summary>
interface IObs
{
void Active();
}
复制代码

        四、具体观察者(ConcreteObserver)

复制代码
class ObsTipShowMsg : IObs
{
publicvoid Active()
{
Console.WriteLine(
"通过TipMessage的方式显示新信息");
}
}
class ObsLightShowMsg : IObs
{
publicvoid Active()
{
Console.WriteLine(
"通过图标闪动方式通知新信息");
}
}
复制代码

        五、客户端

复制代码
class Program
{
staticvoid 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();
}
}
原文地址:https://www.cnblogs.com/jsping/p/2706611.html