• 设计模式之观察者模式


    UML类图:

    举一个生活中的例子:假如一个写字楼的员工定了外卖。是定外卖的人每10分钟就到楼下转一圈儿看外卖到了。还是送外卖的小哥一个个工位的送过去?

    都不是。

    实际上外卖小哥到了写字楼楼下给每个员工打电话,员工就会下楼拿着自己外卖上楼。

    实际上,这就是一个观察者模式。外卖小哥到写字楼楼下--》自己的状态改变了---》通过手机通知所有的观察者

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

    • Subject:抽象主题,抽象主题里包含了一个list,这个list是所有的observer,你可以通过atach添加一个observer,也可以通过detach删掉一个observer。还包含了一个

    Notify函数,这个函数可以调用所有observer的update函数,来更新自己的状态。

    • Observer:为所有的具体观察者提供了一个接口update。
    • ConcreteSubject:具体主题,也就是具体的被观察者。里面包含了自己的state信息。
    • ConcreteObserver:具体的观察者,观察者里面可以包含一个所相关的主题对应的state信息,以及一个实现了的update函数,当调用这个update函数时候,修改自己的state信息。举一个例子,假如被观察是消费者,当消费者已经付钱,表示状态变化,观察者1——出纳员的state改变就是登记入账,观察者2——会计来开发票,观察者3——配送员来发货。
    /// <summary>
        /// 抽象主题类
        /// </summary>
        public abstract class Subject
        {
            private IList<Observer> observers = new List<Observer>();
    
            /// <summary>
            /// 增加观察者
            /// </summary>
            /// <param name="observer"></param>
            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 (Observer o in observers)
                {
                    o.Update();
                }
            }
        }
    
        /// <summary>
        /// 抽象观察者类,为所有具体观察者定义一个接口,在得到通知时更新自己
        /// </summary>
        public abstract class Observer
        {
            public abstract void Update();
        }
    
        /// <summary>
        /// 具体观察者或具体通知者,将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个具体子类实现。
        /// </summary>
        public class ConcreteSubject : Subject
        {
            private string subjectState;
    
            /// <summary>
            /// 具体观察者的状态
            /// </summary>
            public string SubjectState
            {
                get { return subjectState; }
                set { subjectState = value; }
            }
        }
    
        /// <summary>
        /// 具体观察者,实现抽象观察者角色所要求的更新接口,已是本身状态与主题状态相协调
        /// </summary>
        public class ConcreteObserver : Observer
        {
            private string observerState;
            private string name;
            private ConcreteSubject subject;
    
            /// <summary>
            /// 具体观察者用一个具体主题来实现
            /// </summary>
            public ConcreteSubject Subject
            {
                get { return subject; }
                set { subject = value; }
            }
    
            public ConcreteObserver(ConcreteSubject subject, string name)
            {
                this.subject = subject;
                this.name = name;
            }
    
            /// <summary>
            /// 实现抽象观察者中的更新操作
            /// </summary>
            public override void Update()
            {
                observerState = subject.SubjectState;
                Console.WriteLine("The observer's state of {0} is {1}", name, observerState);
            }
        }

    客户端:

    class Program
        {
            static void Main(string[] args)
            {
                // 具体主题角色通常用具体自来来实现
                ConcreteSubject subject = new ConcreteSubject();
    
                subject.Attach(new ConcreteObserver(subject, "Observer A"));
                subject.Attach(new ConcreteObserver(subject, "Observer B"));
                subject.Attach(new ConcreteObserver(subject, "Observer C"));
    
                subject.SubjectState = "Ready";
                subject.Notify();
    
                Console.Read();
            }
        }
  • 相关阅读:
    密码数学大作业
    《数据结构》教材测评
    机器学习概述
    SQL基础-流程控制结构
    SQL基础-变量 存储过程和函数
    SQL基础-视图
    SQL基础-TCL 事务控制语言
    SQL基础-DDL 数据定义语言
    SQL基础-DML 数据操作语言
    SQL基础 -DQL 数据查询语言(下)
  • 原文地址:https://www.cnblogs.com/LUO77/p/5785472.html
Copyright © 2020-2023  润新知