• 观察者(Observer)模式 * 委托事件


    观察者(Observer)模式:定义了一种一对多的依赖关系。让多个观察者对象同时监听某一个主题对象。

         这个主题对象发生变化时会通知所有观察者对象,使他们字段更新自己

    /*
    * 抽象主题(Subject)角色:主题角色把所有对观察考对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者。
      抽象主题提供一个接口,可以增加和删除观察者对象,主题角色又叫做抽象被观察者(Observable)角色,一般用一个抽象类或者一个接口实现。
    * 抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。这个接口叫做更新接口。
      抽象观察者角色一般用一个抽象类或者一个接口实现。在这个示意性的实现中,更新接口只包含一个方法(即Update()方法),这个方法叫做更新方法。
    * 具体主题(ConcreteSubject)角色:将有关状态存入具体现察者对象;
      在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者角色(Concrete Observable)。
      具体主题角色通常用一个具体子类实现。
    * 具体观察者(ConcreteObserver)角色:存储与主题的状态自恰的状态。具体现察者角色实现抽象观察者角色所要求的更新接口,
      以便使本身的状态与主题的状态相协调。如果需要,具体现察者角色可以保存一个指向具体主题对象的引用。
      具体观察者角色通常用一个具体子类实现。
    */

       
                Console.WriteLine("
     =========实例2========== 
    ");
                Secretary1 tongzzhe = new Secretary1();
    
                StockObserver stock = new StockObserver("张某某", tongzzhe);
                NBAObserver nba = new NBAObserver("王某某", tongzzhe);
    
                tongzzhe.Attach(stock);
    
                tongzzhe.Attach(nba);
                tongzzhe.SubjectText = "老板回来了";
                tongzzhe.Notify();
    
                Console.ReadLine();
    
         //抽象通知者 -- 接口
        public interface Subject1
        {
            //增加
            void Attach(Observer1 observer1);
            void Remove(Observer1 observer1);
            void Notify();
            string SubjectText
            { get; set; }
        }
    
        //通知者
        public class Secretary1 : Subject1
        {
            //通知列表
            private List<Observer1> observers = new List<Observer1>();
           
            //增加
            public void Attach(Observer1 observer1)
            {
                observers.Add(observer1);
            }
            public void Remove(Observer1 observer1)
            {
                observers.Remove(observer1);
            }
            //通知
            public void Notify()
            {
                foreach (Observer1 o in observers)
                    o.Update();
            }
            public string SubjectText
            { get; set; }
        }
    
        //抽象观察者
        public abstract class Observer1
        {
            protected string name;
            protected Subject1 sub;
            public Observer1(string name, Subject1 sub)
            {
                this.name = name;
                this.sub = sub;
            }
            public abstract void Update();
        }
    
        //看股票同事
        public class StockObserver : Observer1
        {
            public StockObserver(string name, Subject1 sub)
                : base(name, sub)
            { }
            public override void Update()
            {
                Console.WriteLine("{0},{1} 关闭股票,继续工作。", sub.SubjectText,name);
            }
        }
    
        //看NBA同事
        public class NBAObserver : Observer1
        {
            public NBAObserver(string name, Subject1 sub)
                : base(name, sub)
            { }
            public override void Update()
            {
                Console.WriteLine("{0},{1} 关闭NBA,继续工作。", sub.SubjectText, name);
            }
        }

    观察者模式的演变。  具体观察者 也就是StockObserver 其实就是为 事件提供方法。

                Console.WriteLine("
     =========实例2========== 
    ");
                Secretary1 tongzzhe = new Secretary1();
    
                StockObserver stock = new StockObserver("张某某", tongzzhe);
                NBAObserver nba = new NBAObserver("王某某", tongzzhe);
    
                tongzzhe.Attach(stock.Update); 
                tongzzhe.Attach(nba.Update);
    
                tongzzhe.SubjectText = "老板回来了";
                tongzzhe.Notify();
     
     
       //抽象通知者 -- 接口
        public interface Subject1
        { 
            void Notify(); 
            string SubjectText
            { get; set; }
        }
    
        public delegate void EventHandler();
        //通知者
        public class Secretary1 : Subject1
        {
            // 声明事件; 
            public event EventHandler eventHandler; 
            //通知列表
            private List<Observer1> observers = new List<Observer1>();
           
            //增加
            public void Attach(EventHandler observer1)
            {
                eventHandler += observer1;
            }
    
            public void Remove(EventHandler observer1)
            {
                eventHandler -= observer1;
            }
    
            //通知
            public void Notify()
            {
                if (eventHandler != null)
                    eventHandler();
    
            }
            public string SubjectText
            { get; set; }
        }
    
    
        //抽象观察者
        public abstract class Observer1
        {
            protected string name;
            protected Subject1 sub;
    
            public Observer1(string name, Subject1 sub)
            {
                this.name = name;
                this.sub = sub;
            }
    
            public abstract void Update();
    
        }
    
        //看股票同事
        public class StockObserver : Observer1
        {
            public StockObserver(string name, Subject1 sub)
                : base(name, sub)
            { }
    
            public override void Update()
            {
                Console.WriteLine("{0},{1} 关闭股票,继续工作。", sub.SubjectText,name);
            }
        }
    
        //看NBA同事
        public class NBAObserver : Observer1
        {
            public NBAObserver(string name, Subject1 sub)
                : base(name, sub)
            { }
    
            public override void Update()
            {
                Console.WriteLine("{0},{1} 关闭NBA,继续工作。", sub.SubjectText, name);
            }
        }
  • 相关阅读:
    ubuntu16.04截图工具Shutter安装,设置快捷键
    cd命令和roscd命令的区别,并解决环境变量问题
    ubuntu16.04+kinetic 环境下进行turtlebot2安装+gazebo7.16
    【转载】windows 下TexLive的安装和配置
    Linux 环境变量 /etc/profile 和 ~/.bashrc的区别和使用
    rotors无人机仿真(古月居)——问题记录
    操作select
    #if DEBUG
    (网上看的)asp.net使用uploadify上传出现的IO Error问题
    sqlserver2008附加sqlserver2005数据库目录出错,需要设置mdf后缀文件夹“管理员取得所有权”,并用windows管理权限登录数据库不要用sa
  • 原文地址:https://www.cnblogs.com/dragon-L/p/3783538.html
Copyright © 2020-2023  润新知