• 设计模式之观察者模式


    一:什么事观察者模式?

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

    二:角色?

     

    1)        抽象目标角色(Subject):目标角色知道它的观察者,可以有任意多个观察者观察同一个目标。并且提供注册和删除观察者对象的接口。目标角色往往由抽象类或者接口来实现。

    2)        抽象观察者角色(Observer):为那些在目标发生改变时需要获得通知的对象定义一个更新接口。抽象观察者角色主要由抽象类或者接口来实现。

    3)        具体目标角色(Concrete Subject):将有关状态存入各个Concrete Observer对象。当它的状态发生改变时向它的各个观察者发出通知。

    4)        具体观察者角色(Concrete Observer):存储有关状态,这些状态应与目标的状态保持一致。实现Observer的更新接口以使自身状态与目标的状态保持一致。在本角色内也可以维护一个指向Concrete Subject对象的引用。

    三:结构图

    四:观察者模式代码

       //抽象主题类,抽象主题提供一个接口,可以增加和删除观察者对象。
        public abstract class Subject
        {
    
            private List<Observer_u> observer=new List<Observer_u>();
    
            //添加观察者
            public void Attach(Observer_u obser)
            {
                observer.Add(obser);
            }
            //移除观察者
            public void Detach(Observer_u obser)
            {
                observer.Remove(obser);
            }
    
            //向观察者(们)发出通知
            public void Notify()
            {
                foreach (var ob in observer)
                {
                    ob.Update();
                }
            }
    
        }
        //抽象观察者类,便于在得到通知时修改自己
        public abstract class Observer_u
        {
            public abstract void Update();
    
        }
        //具体观察者或具体通知者,将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个具体子类实现。
       public  class ConcreteSubject:Subject
       {
           //具体观察者的状态
           private string concreteSate;
           public string ConcreteSate
           {
               get { return concreteSate; }
               set { concreteSate = value; }
           }
    
       }
        //具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。
        public class ConcreteObserver : Observer_u
        {
            private string state;
            private string name;
    
            private ConcreteSubject subject;
    
            //具体观察者用一个具体主题来实现
            public ConcreteSubject Subject
            {
                get { return subject; }
                set { subject = value; }
            }
            
            public ConcreteObserver(ConcreteSubject subject, string name)
            {
                this.subject = subject;
                this.name = name;
            }
    
            //实现抽象观察者中的更新操作
            public override void Update()
            {
                state = subject.ConcreteSate;
                Console.WriteLine("都有{0}一起出去看电影{1}",name,state);
            }
        }
       class Program
        {
            static void Main(string[] args)
            {
                ConcreteSubject sub=new ConcreteSubject();
                sub.Attach(new ConcreteObserver(sub,"小明"));
                sub.Attach(new ConcreteObserver(sub, "小灰"));
                sub.Attach(new ConcreteObserver(sub, "小刚"));
                sub.ConcreteSate = "看电影";
                sub.Notify();
                Console.Read();
            }
        }
  • 相关阅读:
    Android执行时ART载入OAT文件的过程分析
    Oracle GoldenGate 支持 从SAP HANA database抽取或者复制数据到SAP HANA database 吗?
    【机房收费系统C#版】——导出Excel
    【STL容器学习】-关联容器与map的用法
    IOS
    使用Android Studio 1.3 版本号进行NDK开发
    4443: [Scoi2015]小秃玩矩阵|二分答案|匈牙利
    多版本号并发控制(MVCC)在实际项目中的应用
    memcached远程 telnet 无法连接,解决方案
    Memcached 服务器端命令
  • 原文地址:https://www.cnblogs.com/xiaoyaodijun/p/4661211.html
Copyright © 2020-2023  润新知