• 观察者模式 -- 大话设计模式


    在今天,读书有时是件“麻烦”事。它需要你付出时间,付出精力,还要付出一份心境。--仅以《大话设计模式》来祭奠那逝去的……

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

    1.观察者模式应用

      定义抽象通知者(主题)和抽象观察者,抽象通知者负责增加、移除和通知抽象观察者,抽象观察者得到通知的时候更新自己

        /// <summary>
        /// 主题或者抽象通知者
        /// </summary>
        public abstract class Subject
        {
            private IList<Observer> observers = new List<Observer>();
    
            /// <summary>
            /// 增加观察者
            /// </summary>
            public void Attach(Observer observer)
            {
                observers.Add(observer);
            }
    
            /// <summary>
            /// 移除观察者
            /// </summary>
            /// <param name="observer"></param>
            public void Detach(Observer observer)
            {
                observers.Remove(observer);
            }
    
            /// <summary>
            /// 通知观察者
            /// </summary>
            public void Notify()
            {
                foreach (var v in observers)
                {
                    v.Update();
                }
            }
        }
    
        /// <summary>
        /// 抽象观察者(为所有具体观察者定义的一个接口,在得到主题通知时更新自己)
        /// </summary>
        public abstract class Observer
        {
            public abstract void Update();
        }
    

       定义具体通知者(主题)和具体观察者,具体观察者实现具体业务

        /// <summary>
        /// 具体主题或者通知者
        /// </summary>
        public class ConcreteSubject : Subject
        {
            public string SubjectState { get; set; }
        }
    
        /// <summary>
        /// 具体观察者
        /// </summary>
        public class ConcreteObserver : Observer
        {
            private string _name;
    
            public ConcreteSubject Subject { get; set; }
    
            public ConcreteObserver(ConcreteSubject subject, string name)
            {
                this._name = name;
                this.Subject = subject;
            }
    
            public override void Update()
            {
                Console.WriteLine("观察者{0}:通知者发来最新消息【{1}】", this._name, this.Subject.SubjectState);
            }
        }
    

       开启场景模拟

            static void Main(string[] args)
            {
                ConcreteSubject s = new ConcreteSubject();
    
                s.Attach(new ConcreteObserver(s, "X"));
                s.Attach(new ConcreteObserver(s, "Y"));
                s.Attach(new ConcreteObserver(s, "Z"));
    
                s.SubjectState = "ABC";
                s.Notify();
            }
    
  • 相关阅读:
    idea安装好python后显示无SDK问题
    使用idea在windows上连接远程hadoop开发_配置环境
    最小二乘法估计----MATLAB最小二乘法求一元线性回归
    MATLAB最小二乘法求线性回归
    MATLAB求解线性规划(含整数规划和0-1规划)问题
    蒙特卡洛方法蒙特卡洛方法 matlab 实现 matlab 实现
    MATLAB神经网络实例及训练结果各参数解释
    单元格添加斜线
    ppt的高级设计法——虚实结合
    word中插入六角括号的方法﹝﹞
  • 原文地址:https://www.cnblogs.com/amywechat/p/4924786.html
Copyright © 2020-2023  润新知