zoukankan      html  css  js  c++  java
  • 观察者模式

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

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

      

        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.
  • 相关阅读:
    iOS开发- UICollectionView详解+实例
    iOS 8出色的跨应用通信效果:解读Action扩展
    iOS开发宝典:String用法大全
    Masonry介绍与使用实践
    UILabel 行间距设置
    libc++abi.dylib: terminate_handler unexpectedly threw an exception错误小结
    适配iOS 8备忘录 开始启动(持续更新。。。1130)
    “System.AccessViolationException”类型的未经处理的异常在 System.Data.dll 中发生 其他信息: 尝试读取或写入受保护的内存。这通常指示其他内存已损坏
    HighCharts 详细使用及API文档说明
    跟我一起从零开始学WCF系列课程
  • 原文地址:https://www.cnblogs.com/student-note/p/6131726.html
Copyright © 2011-2022 走看看