不得不懂的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