• 观察者模式(Observer)


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

    这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

    namespace ObserverPattern
    {
        //观察者模式 2017。09.16 09:36 added  by longdb
    
         /// <summary>
         /// 主题类或者抽象通知者类
         /// </summary>
        abstract class Subject
        {
            private IList<Observer> observerlist = new List<Observer>();
    
            /// <summary>
            /// 增加观察者
            /// </summary>
            /// <param name="observer"></param>
            public void Attach(Observer observer)
            {
                observerlist.Add(observer);
            }
            /// <summary>
            /// 移除观察者
            /// </summary>
            /// <param name="observer"></param>
            public void Detach(Observer observer)
            {
                observerlist.Remove(observer);
            }
    
            /// <summary>
            /// 通知观察者。
            /// </summary>
            public void Notify()
            {
                foreach (var ob in observerlist)
                {
                    ob.Update();
                }
            }
        }
    
        /// <summary>
        /// 具体主题或者具体通知者。
        /// 将有关状态存入具体观察者对象;
        /// 在具体的主题的内部状态改变时,给所有登记过的观察者发出通知。
        /// </summary>
        class ConcreatSubject : Subject
        {
            private string subjectstate;
    
            /// <summary>
            /// 具体被观察者的对象。
            /// </summary>
            public string SubjectState
            {
                get { return subjectstate; }
                set { subjectstate = value; }
            }
        }
    
        /// <summary>
        /// 抽象观察者类。
        /// </summary>
        abstract class Observer
        {
            public abstract void Update(); 
        }
    
        /// <summary>
        /// 具体观察者,实现抽象观察者角色所有要求的更新接口,
        /// 以便使本身的状态和主题的状态相协调。
        /// </summary>
        class ConcreatObserver : Observer
        {
            private string name;
            private string observerState;
            private ConcreatSubject subject;
    
            public ConcreatObserver(ConcreatSubject subject,string name)
            {
                //构造器注入。
                this.subject = subject;
                this.name = name;
            }
            public override void Update()
            {
                observerState = subject.SubjectState;
                Console.WriteLine("观察者{0}的新状态是{1}",name,observerState);
            }
    
            public ConcreatSubject Subject
            {
                get { return subject; }
                set { subject = value; }
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                ConcreatSubject sub = new ConcreatSubject();
                sub.Attach(new ConcreatObserver(sub, "张三"));
                sub.Attach(new ConcreatObserver(sub, "李四"));
                sub.Attach(new ConcreatObserver(sub, "王五"));
    
                sub.SubjectState = "abc";
                sub.Notify();
    
                Console.ReadKey();
            }
        }
    }
  • 相关阅读:
    抓取登录后的数据
    Form认证的几点说明
    eclipse启动错误:java.lang.NoClassDefFoundError: org/eclipse/core/resources/IContainer
    mysql游标的使用 No data
    mysql insert 主键 重复问题
    tail 命令
    maven 打包可执行jar的方法
    maven中如何打包源代码
    工程师,请优化你的代码
    在服务器端判断request来自Ajax请求(异步)还是传统请求(同步)
  • 原文地址:https://www.cnblogs.com/longdb/p/7530422.html
Copyright © 2020-2023  润新知