观察者模式

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

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

  

    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+":发送给\t\t"+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+":发送给\t\t"+this.Name);
        }
        public void addPull(Theme t)
        {
           this.th=t;
        }
        public void Pull()
        {
            Console.WriteLine("姓名:{0}\t这个是我拉取出来的\t{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();
        }

 

posted @ 2016-12-04 20:19  夏风微凉  阅读(230)  评论(0编辑  收藏  举报