不得不懂的C#設計模式學習(二)


    今天咱們學習觀察者模式,直接進入主題。

觀察者模式又叫發布模-訂閱(Publish/Subscribe)模式

   定義了一種一對多的依賴關系,讓多個觀察對象同時觀察某一個主題對象。這個主題在狀態發生變化時會通知所有的觀察者對象,使它們能夠自動更新自己。

觀察者模式組成

1.抽象主題(Subject類)提供抽象類或者一個接口實現。把所有對觀察者對象的引用保存在一個聚集里,每個主題可以有任意數量的觀察者。抽象主題提供了一個接口,可以增加和刪除觀察者對象.

2.抽象觀察者(Observer)類為所有具體觀察者定義一個接口,在得到主題時更新自己。這個接口叫做更新接口。抽象觀察者用抽象類或者接口實現,更新接口包含一個更新方法(Update)。

3.具體主題(ConcreteSubject)類,存放具體觀察者對象;在具體主題的內部狀態改變時,給所有觀察者發出通知。具體角色用具體子類實現。

4.具體觀察者(ConcreteObserver)類,實現抽象觀察者的更新接口,以便和主題狀態協調,具體觀察者用具體子類實現。

示例:

abstract class 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 ;
        private string observerState;
        private ConcreteSubject subject;
     
        public ConcreteObserver(ConcreteSubject subject,string name)

       {
            this.subject=subject;
            this.name=name;
       }

       public override void Update()
      {
            observerState=subject.SubjectState;
            Console.WriteLine("觀察者{0}的新狀態是{1}",name,observerState);
       }

       public ConcreteSubject Subject
       {
             get{return subject;}
             set{subject=value;}
        }
}

static void Main(string[] args)
        {
            ConcreteSubject s = new ConcreteSubject();
            s.Attach(new ConcreteObserver(s, "X"));
            s.Attach(new ConcreteObserver(s, "Y"));
            s.Attach(new ConcreteObserver(s, "Z"));

            s.SubjectState = "ABC";
            s.Notify();
            Console.Read();

        }

總結:觀察者模式所做的工作其實就是在解除耦合。讓耦合的雙方都依賴於抽象,而不是依賴於具體,從而使得各自的變化都不會影響另一邊的變化。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM