• 观察者模式


    定义了一种一对多的依赖关系,让多个观察者对象通俗监听某个主题对象,这个主题 对象在状态发生变化时,会通知所有观察者对象,使它们能自动更新自己

        先来看一个例子,也就是说一个报纸厂商,最近为客户提供了一个新的功能,那就订阅,当某个主题的报纸更新时,厂商会派人为这些订阅的人送去报纸

      

        class Theme//主题
        {
            private List<INotify> Tobserver = new List<INotify>();
           
            public void Notify()
            {
                foreach (var item in Tobserver)
                {
                    item.Update("你就当我是一段文本内容");
                }
            }
            public void AddObserver(INotify i)
            {
                Tobserver.Add(i);
            }
            public void RemoveObserver(INotify i)
            {
                Tobserver.Remove(i);
            }
        }
        interface INotify
        {
            void Update(string s);
        }
        class Observer : INotify//观察者
        {
            private string Name;
            public Observer(string name)
            {
                this.Name = name;
            }
            public void Update(string s)
            {
                Console.WriteLine(s+":发送给		"+this.Name);
            }
        }

        在这里呢,因为只是一个简单的演示,所以说,并没有创建观察者抽象类和主题抽象类,毕竟用到的时候在写嘛,不要对未知的东西去猜测

            static void Main(string[] args)
            {
                Theme th = new Theme();
                Observer o1 = new Observer("小明");
                Observer o2 = new Observer("小白");
                th.AddObserver(o1);
                th.AddObserver(o2);
                th.Notify();
                Console.Read();
            }

       当然这样子的观察者模式是不完整的,或者说不好的,主要问题为:并不是每个订阅的用户都需要在刚发布的时候得到,也就是说需要为观察者添加一个pull(拉)的方法

        让观察者来决定什么时候获取主题消息!!

      

        class Theme//主题
        {
            private List<INotify> Tobserver = new List<INotify>();
            private string currentStr=string.Empty;
            public string CurrentStr
            {
                get
                {
    
                    if (currentStr == string.Empty)
                    {
                        return "对不起当前没有订阅主题";
                    }
                    else
                        return currentStr;
                }
                set {
    
                    currentStr = value;
                    this.Notify();
                }
            }
            public void Notify()
            {
                foreach (var item in Tobserver)
                {
                    item.Update(CurrentStr);
                }
            }
            public void AddObserver(INotify i)
            {
                Tobserver.Add(i);
                i.addPull(this);
               
            }
            public void RemoveObserver(INotify i)
            {
                Tobserver.Remove(i);
            }
        }
        interface INotify
        {
            void Update(string s);
            void addPull(Theme t);
        }
        class Observer : INotify//观察者
        {
            private Theme th = null;
            private string Name;
            public Observer(string name)
            {
                this.Name = name;
            }
            public void Update(string s)
            {
                Console.WriteLine(s+":发送给		"+this.Name);
            }
            public void addPull(Theme t)
            {
               this.th=t;
            }
            public void Pull()
            {
                Console.WriteLine("姓名:{0}	这个是我拉取出来的	{1}",this.Name,th.CurrentStr);
            }
        }
            static void Main(string[] args)
            {
                Theme th = new Theme();
                Observer o1 = new Observer("小明");
                Observer o2 = new Observer("小白");
                th.AddObserver(o1);
                th.AddObserver(o2);
                th.Notify();
                th.CurrentStr = "最新科幻片0-0";
                o1.Pull();
                Console.Read();
            }

    Hold on, everything is possible.
  • 相关阅读:
    [DICOM]SCU和SCP
    [CentOS7]安装Python3
    解决mysqlCannot truncate a table referenced in a foreign key constraint
    对称加密和非对称加密,自签证书,ssl证书
    Qt QRadioButton 选中/取消选中
    Qt QPixmap设置图片透明度
    Qt 建立文件夹、判断文件夹是否存在、文件夹是否为空、清空文件夹
    Qt 删除某文件目录下的空文件夹
    python 3.6 生成器
    tensorflow tfserving 部署记录
  • 原文地址:https://www.cnblogs.com/student-note/p/6131726.html
Copyright © 2020-2023  润新知