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 下载。

转载于:https://www.cnblogs.com/chengxingliang/archive/2011/08/22/2147142.html

极速理解设计模式系列:2.观察者模式(Observer Pattern)相关推荐

  1. 我理解设计模式C++实现观察者模式Observer Pattern

    概述: 近期中国股市起起伏伏,当然了起伏就用商机,小明发现商机后果断想入市,买入了中国证券,他想在电脑client上,网页上,手机上,iPad上都能够查看到该证券的实时行情,这样的情况下我们应该怎么设 ...

  2. 极速理解设计模式系列【目录索引】

    这是一个老生常谈的设计模式系列文章,本系列力图从最简洁的语言和最易理解的实例来让大家认识设计模式的思想和思路,从而在实际项目中能够用到一二.现在将本系列文章详列如下: 极速理解设计模式系列:1.建造者 ...

  3. 极速理解设计模式系列:23.装饰器模式(Decorator Pattern)

    五个角色:部件(Component).具体部件(ConcreteComponent).装饰抽象类(Decorator).具体装饰对象(ConcreteDecorator).客户端(Client) 部件 ...

  4. 极速理解设计模式系列:7.桥接模式(Bridge Pattern)

    四个角色:抽象类(Abstraction).扩充抽象类(RefinedAbstraction).实现类接口(Implementor).具体实现类(ConcreteImplementor) 抽象类(Ab ...

  5. 极速理解设计模式系列:9.工厂方法模式(Factory Method Pattern)

    五个角色:产品角色(Product).真实产品角色(ConcreteProduct).工厂角色(Creator).真实工厂角色(ConcreteCreator).客户端(Client) 产品角色(Pr ...

  6. 极速理解设计模式系列:22.状态模式(State Pattern)

    四个角色:抽象状态类(State).具体状态类(ConcreateState).情景类(Context).客户端(Client) 抽象状态类(State):提供一个与情景类有关的State行为. 具体 ...

  7. 极速理解设计模式系列:6.适配器模式(Adapter Pattern)

    四个角色:目标抽象类角色(Target).目标对象角色(Adapter).源对象角色(Adaptee).客户端角色(Client) 目标抽象类角色(Target):定义需要实现的目标接口 目标对象角色 ...

  8. 极速理解设计模式系列:4.原型模式(Prototype Pattern)

    四个角色:抽象原型角色(Prototype).具体原型角色(ConcretePrototype).原型管理器角色(PrototypeManager).客户端角色(Client) 抽象原型角色(Prot ...

  9. 极速理解设计模式系列:11.单例模式(Singleton Pattern)

    单例模式:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 三要点: 一.单例类只能有一个实例 二.单例类必须自行创建自身实例 三.单例类自行向整个系统提供实例 类 ...

最新文章

  1. spring boot自动配置
  2. java对象序列化java.io.Serializable 接口实践
  3. apache weblogic ssl linux,apache基于ssl配置weblogic(完结篇)
  4. 获取数组中的最大、最小值
  5. redis 客户端_你在使用什么 Redis 客户端工具?
  6. 多维随机变量与其对应的分布
  7. 怎么把程序内部坐标转为屏幕坐标,如何将工作空间坐标转换为屏幕坐标?
  8. python_dataframe总结1
  9. 网吧无盘服务器进u盘启动,利用U盘启动在网吧免费上网
  10. android 11.0 12.0去掉前置摄像头闪光灯功能
  11. vue中用cdn引入优化vender.js大小,和cdn 引入mint-ui的问题
  12. JQuery Mobile试试水
  13. 服务器挂起文件怎么删除,挂起的更改
  14. Linux驱动快速入门
  15. macbook pro 用 DP 接口外接显示器系统音量不可用
  16. C#使用OleDB操作ACCESS插入数据时提示:标准表达式中数据类型不匹配。
  17. 【Jenkins】win 10 / win 11:Jenkins 的下载、安装、部署(Jenkins 2.365 基于 Java 17)
  18. Linux——LDAP(相当于Windows下的AD)
  19. 网络信息安全之基于时间的安全模型(PDR和PPDR模型)
  20. matlab tcpip数据解析,Matlab数据输出、从MATLAB 以tcpip形式传输数据到 vvvv

热门文章

  1. APP技巧:一次性给手机充电到100%最佳?大部分人都做错了
  2. 电脑操作系统维护10条实用建议!
  3. 前端:Element UI 多选框组用法笔记
  4. 电脑中毒的表现有哪些?电脑中毒了怎么办?
  5. Linux 与 Unix 到底有什么不同?
  6. 87岁老奶奶用微软自带画图软件绘画 惊艳了世人
  7. mysql读书笔记---if语句
  8. Linux下的屏保设置 xset s 与 xset dpms
  9. keynote使用手册_如何使用Keynote和智能手机为AR创建原型
  10. sketch浮动布局_使用智能布局和调整大小在Sketch中创建更好的可重用符号