设计模式 - 观察者模式

一、观察者模式概述

+观察者模式又叫做发布-订阅模式
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同事监听某一个主题对象,使它们能够自动更新自己。

  • 将一个系统分割成一系列相互协作的类有一个很不好的副作用,就是需要维护相关对象间的一致性。但是不能为了维持一致性二是的各类之间紧密偶尔,这几样会给维护,扩展和重用都带来不便。
  • 观察者模式的关键对象是:
    • 主题 Subject
    • 观察者 Observer
  • 一个主题可以有很多个 Observer,具体谁是观察者,主题不用知道。

二、什么时候使用观察者模式

  • 当一个对象改变的时候同时改变其他对象,并且它不需要直到具体有多少对象有待改变的时候。

三、委托

  • 委托就是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的是用可以像其他任何方法一样,具有参数和返回值。委托可以看作是对函数的抽象,是函数的类,委托的实例将代表一个具体的函数。
  • 一个委托可以搭载多个方法,所有方法被一次唤起。更加重要的是,它可以使得委托对象所搭载的方法并不需要属于同一个类。
  • 代码
       //通知者接口     
       interface Subject
       {
           void Attatch(Observer observer);
           void Detach(Observer observer);
           void Notify();
           string SubjectState
           {
               get;
               set;
           }
       }       
       //声明一个委托
       delegate void EventHandler();
       class Boss: Subject
       {
           //声明一个事件 Update,类型为委托 EventHandler
           public event EventHandler Update;
           
           //同事列表
        //    private IList<Observer> observers = new List<observer>();
           private string action;
        //    //add
        //    public void Attatch(Observer observer)
        //    {
        //        observers.Add(observer);
        //    }
           
        //    //minus
        //    public void Detach(Observer observer)
        //    {
        //        observers.Remove(observer);
        //    }
           //notify
           public void Notify()
           {
                Update();
           }
           //Boss state
           public string SubjectState
           {
               get{return action;}
               set{action = value;}
           }
       }
       class Secretary:Subject
       {
                      //同事列表
           private IList<Observer> observers = new List<observer>();
           private string action;
           //add
           public void Attatch(Observer observer)
           {
               observers.Add(observer);
           }
           
           //minus
           public void Detach(Observer observer)
           {
               observers.Remove(observer);
           }
           
           //notify
           public void Notify()
           {
               foreach (Observer o in observers)
               {
                   o.Update();
               }
           }
           //Boss state
           public string SubjectState
           {
               get{return action;}
               set{action = value;}
           }   
       }
       //abstract observer
       abstract class Observer
       {
           protected string name;
           protected Subject sub;
           
           public Observer(string name,Subject sub)
           {
               this.name = name;
               this.sub = sub;
               
               public abstract void Update();
           }
           
       }
       class StockObserver
       {
           public StockObserver(string name.Subject sub):base(name,sub)
           {
            
           }
           public override void CloseStockMarket()
           {
               Console.WriteLine("{0} {1} 关闭股票行情,继续工作!",sub.SubjectState,name);
           }
       }
       class NBAObserver
       {
           private string name;
           private Subject sub;
           public NBAObserver(string name,Subject sub)
           {
               this.name = name;
               this.sub = sub;
           }
           //close NBA
           public void CloseNBADirectSeeding()
           {
               Console.WriteLine("{0} {1} 关闭NBA,继续工作!",sub.SubjectState,name);
           }
       }
       //客户端主函数
       class MainClass
       {
           public static void Main(strnig[] args)
           {
               //老板
               Boss boss = new Boss();
               //同事1
               StockObserver one = new StockObserver("nameOne",boss);
               //同事2
               StockObserver two = new StockObserver("nameTwo",boss);
               
               boss.Update += EventHandler(one.CloseStockMarket);
               boss.Update += EventHandler(two.CloseNBADirectSeeding);               
            //    boss.Attatch(one);
            //    boss.Attatch(two);
            //    boss.Detach(one);
               boss.SubjectState = "Come Back";
               boss.Notify(); 
          }
       }
       ```
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容