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

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

观察者模式

  观察者模式是什么?

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

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

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

  观察者模式结构图:

  

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

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
原文地址:https://www.cnblogs.com/Neko-YG/p/13359046.html