美文网首页设计模式
设计模式 - 观察者模式

设计模式 - 观察者模式

作者: Mitchell | 来源:发表于2016-05-01 21:59 被阅读37次

    一、观察者模式概述

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

    • 将一个系统分割成一系列相互协作的类有一个很不好的副作用,就是需要维护相关对象间的一致性。但是不能为了维持一致性二是的各类之间紧密偶尔,这几样会给维护,扩展和重用都带来不便。
    • 观察者模式的关键对象是:
      • 主题 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(); 
              }
           }
           ```

    相关文章

      网友评论

        本文标题:设计模式 - 观察者模式

        本文链接:https://www.haomeiwen.com/subject/pnxlrttx.html