• 不得不懂的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();
    
            }

    总结:观察者模式所做的工作其实就是在解除耦合。让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。

  • 相关阅读:
    Vue自定义过滤器格式化数字三位加一逗号
    js复制功能
    vue中数据接收成功,页面渲染失败
    css技巧
    vue+elementUI table篇
    图片预加载
    jquery实现文字自动向上滚动,鼠标放上去停止,移开继续滚动代码...
    【Flutter】广播机制
    【Flutter】IOS打包
    【Flutter】BottomNavigationBar切换页面被重置问题(保存状态)
  • 原文地址:https://www.cnblogs.com/mondLei/p/3012118.html
Copyright © 2020-2023  润新知