zoukankan      html  css  js  c++  java
  • 极速理解设计模式系列:2.观察者模式(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>
    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 下载。

  • 相关阅读:
    【Codeforces 1172F】—Nauuo and Bug(线段树+双指针)
    【Codeforces 1172F】—Nauuo and Bug(线段树+双指针)
    【BZOJ4671】—异或图(斯特林反演+线性基)
    【BZOJ4671】—异或图(斯特林反演+线性基)
    【Codeforces #453 E】—Little Pony and Lord Tirek(线段树/均摊分析)
    【Codeforces #453 E】—Little Pony and Lord Tirek(线段树/均摊分析)
    【Codeforces 480E】—Parking Lot(线段树+单调队列)
    【Codeforces 480E】—Parking Lot(线段树+单调队列)
    web安全
    Jodd——java瑞士军刀
  • 原文地址:https://www.cnblogs.com/chengxingliang/p/2147142.html
Copyright © 2011-2022 走看看