首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

【设计方式】把风放哨,防老板 - 观察者模式

2012-08-08 
【设计模式】把风放哨,防老板---观察者模式一,概述观察者Observer模式(有时又被称为发布-订阅Publish/Sub

【设计模式】把风放哨,防老板 --- 观察者模式

一,概述

        观察者<Observer>模式(有时又被称为发布-订阅<Publish/Subscribe>模式、模型-视图<Model/View>模式、源-收听者<Source/Listener>模式或从属者<Dependents>模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。

 

二,示例

        题目描述:公司里有的员工偷懒,看股票,看NBA。老板回来需要有人通知他们,然后再好好干活。通知大家的任务交给前台。

 

       1)双向耦合的代码 (读此代码之前先看两个类互相包含)       

             缺点:前台通知类和看股票者相互耦合。如果再想增加一个看NBA的类就违反“开放-- 封闭原则”

  

             StockObserver.h类()



 

          Secretary.h




           main.cpp(客户端程序)


            2)解除耦合实践一:(C#)

 

        增加了抽象的观察者,方便扩展各种类型的扩展者。


                  3)解除耦合实践二:(C#)

                                    改进:由于老板来了会自己通知职员,前台也可以偷偷通知职员老板来了。所以增加一个通知者接口。


 

 

三,观察者模式

 

         发布--订阅模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己。

        

观察者基本代码:抽象通知者类,具体实现通知者类,抽象观察者类,具体实现观察者类

                             抽象通知者为具体实现者父类,负责通知注册的观察者类

              

    class Program
    {
        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();

        }
    }


    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();
            }
        }
    }

    //具体通知者
    class ConcreteSubject : Subject
    {
        private string subjectState;

        //具体通知者状态
        public string SubjectState
        {
            get { return subjectState; }
            set { subjectState = value; }
        }
    }


    abstract class Observer   //抽象观察者
    {
        public abstract void Update();
    }

    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; }
        }
    }


四,观察者模式的特点

         问题:

        1)将一个系统分割成一系列相互协作的类有一个不好的副作用:需要维护相对对象的一致性

        2)我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便

        观察者优点:

         1)让耦合的双方都依赖于抽象,而不是依赖于具体。抽象不变,具体会变化

 



热点排行