• 观察者模式


    观察者模式属于行为型模式,其意图是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

    这一个模式的关键对象是目标(Subject)和观察者(Observer)。一个目标可以有任意数目的依赖它的观察者,一旦目标的状态发生改变,所有的观察者都得到通知,作为对这个通知的响应,每个观察者都将查询目标以使其状态与目标的状态同步。
     
    适用场景:
    观察者模式,用于存在一对多依赖关系的对象间,当被依赖者变化时,通知依赖者全部进行更新。因此,被依赖者,应该有添加/删除依赖者的方法,且可以将添加的依赖者放到一个容器中;且有一个方法去通知依赖者进行更新。
     
    代码1:主题,当主题更新的时候会向监听他的对象发送消息
    //通知者接口
        interface Subject
        {
            void Notify();
            string SubjectState
            {
                get;
                set;
            }
        }
    
        //事件处理程序的委托
        delegate void EventHandler();
    
        class Secretary : Subject
        {
            //声明一事件Update,类型为委托EventHandler
            public event EventHandler Update;
    
            private string action;
    
            public void Notify()
            {
                Update();
            }
            public string SubjectState
            {
                get { return action; }
                set { action = value; }
            }
        }
    
        class Boss : Subject
        {
            //声明一事件Update,类型为委托EventHandler
            public event EventHandler Update;
    
            private string action;
    
            public void Notify()
            {
                Update();
            }
            public string SubjectState
            {
                get { return action; }
                set { action = value; }
            }
        }
    

    代码2:观察者,关注主题,观察主题,被动接受主题的消息推送

    //看股票的同事
        class StockObserver
        {
            private string name;
            private Subject sub;
            public StockObserver(string name, Subject sub)
            {
                this.name = name;
                this.sub = sub;
            }
    
            //关闭股票行情
            public void CloseStockMarket()
            {
                Console.WriteLine("{0} {1} 关闭股票行情,继续工作!", sub.SubjectState, name);
            }
        }
    
        //看NBA的同事
        class NBAObserver
        {
            private string name;
            private Subject sub;
            public NBAObserver(string name, Subject sub)
            {
                this.name = name;
                this.sub = sub;
            }
    
            //关闭NBA直播
            public void CloseNBADirectSeeding()
            {
                Console.WriteLine("{0} {1} 关闭NBA直播,继续工作!", sub.SubjectState, name);
            }
        }
    

    代码3:客户端代码

    class Program
        {
            static void Main(string[] args)
            {
                //老板胡汉三
                Boss huhansan = new Boss();
    
                //看股票的同事
                StockObserver tongshi1 = new StockObserver("魏关姹", huhansan);
                //看NBA的同事
                NBAObserver tongshi2 = new NBAObserver("易管查", huhansan);
    
                huhansan.Update += new EventHandler(tongshi1.CloseStockMarket);
                huhansan.Update += new EventHandler(tongshi2.CloseNBADirectSeeding);
    
                //老板回来
                huhansan.SubjectState = "我胡汉三回来了!";
                //发出通知
                huhansan.Notify();
    
                Console.Read();
    
    
            }
        }
    

      

  • 相关阅读:
    Dropplets – 极简的 Markdown 博客平台
    T3
    Awesomplete
    SVG Drawing Animation
    Dom Animator – 提供 Dom 注释动画的 JS 库
    Electron
    很赞的效果!互动的页面元素拖放着色实验
    BookBlock
    雷军投资的理财网站,年化收益13%!
    Rainyday.js – 使用 JavaScript 实现雨滴效果
  • 原文地址:https://www.cnblogs.com/wuMing-dj/p/3359220.html
Copyright © 2020-2023  润新知