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.
  • 相关阅读:
    多个类定义attr属性重复的问题:Attribute "xxx" has already been defined
    好用的批量改名工具——文件批量改名工具V2.0 绿色版
    得到ImageView中drawable显示的区域的计算方法
    得到view坐标的各种方法
    实现类似于QQ空间相册的点击图片放大,再点后缩小回原来位置
    Material Designer的低版本兼容实现(五)—— ActivityOptionsCompat
    Android 自带图标库 android.R.drawable
    解决 Attempting to destroy the window while drawing!
    解决Using 1.7 requires compiling with Android 4.4 (KitKat); currently using API 4
    Material Designer的低版本兼容实现(四)—— ToolBar
  • 原文地址:https://www.cnblogs.com/student-note/p/6131726.html
Copyright © 2011-2022 走看看