• 【设计模式】(二)观察者模式是什么?


    以下内容仍在更新完善...

    观察者模式

      观察者模式是什么?

        观察者模式定义一种一对多的依赖关系,让多个观察者对象同时观察一个主题对象。当主题对象发生相应状态变化是,会通知所有观察者对象并使观察者对象自动更新自己的状态。

        因此,当一个对象的改变需要同时改变其他对象的时候,使用观察者模式方便简洁

        观察者模式的本质就是在解除耦合,让原本耦合的双方都依赖于抽象而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。即:具体观察者---抽象观察者,具体主题对象---抽象主题对象。具体对象继承抽象对象。

      观察者模式结构图:

      

      下面给出抽象类的代码示例(抽象主题和抽象观察者):

    abstract class Subject //抽象主题Subject类
    {
        private IList<Observer> observers = new List<Observer>();//用于保存观察者对象的引用
        
        //增加观察者
        public void Attach(Observer observer)
        {
            observers.Add(observer);    
        }   
        //减少观察者
        public void Detach(Observer observer)
        {
            observers.Remove(observer);    
        }   
        //通知
        public void Notify()
        {
             foreach (Observer o in observers)
             {
                  o.Update();
             }
        }  
    }      
    
    
    abstract class Observer //抽象观察者类
    {
         public abstract void Update();
    }

      下面给出具体类的代码示例(具体主题和具体观察者):

    class ConcreteSubject : Subject  //具体主题
    {
        private string subjectState;
    
        //具体被观察者状态
        public string SubjectState
        {
             get { return  subjectState; }
             set { subjectState = value; }  
        }  
    }
    
    
    class ConcreteObserver : Observer //具体观察者
    {
         private:
               string name;
               string observerState;
               ConcreteSubject subject;
    
         public:
               ConcretaObserver(ConcreteSubject subject, string name)
               {
                      this.subject = subject;
                      this.name = name;
               }
                override void Update()
                {
                       observerState = subject.SubjectState;
                       Console.WriteLine("观察者{0}的新状态是{1}",name,observerState);
                }
                ConcreteSubject Subject
                {
                       get { return subject; }
                       set { subject = value; }
                }
     }

      客户端代码示例:

    static void main(string[] args)
    {
          ConcreteSubject s = new ConcreteSubject();
    
          s.Attach(new ConcreteObsetver(s,"X"));
          s.Attach(new ConcreteObsetver(s,"Y"));
    
          s.SubjectState = "ABC";
          s.Notify();
    
          console.Read();    
    }
    //结果显示:
    //观察者X的新状态是ABC
    //观察者Y的新状态是ABC
  • 相关阅读:
    Python-24-多线程
    RT-Thread动态内存堆的使用
    Linux编程概念
    Linux_C语言基础
    文件IO_open(),read(),write(),lseek(),close()
    SourceTree跳转注册的方法
    Linux——软件安装
    初学DOM树解析xml文件
    简单json语句转化为map保存
    最大独立集求解
  • 原文地址:https://www.cnblogs.com/Neko-YG/p/13359046.html
Copyright © 2020-2023  润新知