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>
- 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("在这里目标对象属性变化");
- 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("通过图标闪动方式通知新信息");
- }
- }
五、客户端
- 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 下载。
本文转自程兴亮 51CTO博客,原文链接:http://blog.51cto.com/chengxingliang/826934