您的位置:首页 > 其它

设计模式——观察者模式

2015-12-15 20:03 232 查看

名字:

观察者模式

属性:

行为型

定义:

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

类图:



优点:

让耦合的双方都依赖于抽象,而不依赖于具体,使得各自的变化都不会影响另一边的变化

缺点:

一、 没办法让每个控件都去实现观察者的接口,很多控件早就已经被他们的制造商给封装了

二、 抽象通知者还是依赖抽象观察者,也就是说没有抽象观察者这样的接口,通知的功能就完不成

三、 每个具体的观察者调用的方法不一定相同,很多根本就不是同名的方法

何时用:

一、 一个对象的改变需要同事改变其他对象,并且不知道具体有多少对象有待改变时,应该考虑使用观察者模式。

二、 一个抽象模型有两个方面,其中一方面依赖于另一方面,用观察者模式可以将两者封装在独立的对象中使他们各自独立的改变和复用

代码实现:

通知者接口:



<span style="font-size:18px;">/通知者接口
    interface Subject
    {
        //增加
        void Attach(Observer observer);
        //减少
        void Detach(Observer observer);
        //通知
        void Notify();
        //状态
        string SubjectState
        {
            get;
            set;
        }
    }
</span>


具体通知者:

<span style="font-size:18px;">//通知者
    class Boss : Subject 
    {
        //同事列表
        //增加
        //减少
        //通知
        public string Notify()
        {
            foreach (Observer o in observers)
                o.Update();
        }
        //老板状态
    }
</span>


抽象观察者:

<span style="font-size:18px;">bstract class Observer
    {
        protected string name;
        protected Subject sub;

        public Observer(string name, Subject sub)
        {
            this.name = name;
            this.sub = sub;
        }
        public abstract void Update();
    }
</span>


具体观察者:

<span style="font-size:18px;">/看股票的同事
    class StockObserver : Observer 
    {
        public override void Update()
        {
            ......
        }
    }
</span>


客户端:

<span style="font-size:18px;">  static void Main(string[] args)
        {
            //省略实例化过程

            huhansan.Attach(tongshi1);

            huhansan.SubjectState = "我回来了"
            //发出通知
            huhansan.Notify();
        }
</span>


备注:

委托:是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值。

优点:

一、 一个委托可以搭载多个方法,所有方法被一次唤起。

二、 委托可以使得委托对象所搭载的方法并不属于同一个类

局限性:委托对象所搭载的所有方法必须具有相同的原型和形式,也就是拥有相同的参数列表和返回值类型。

使用:

声明委托:

Delegate void EventHandler();

声明委托事件Update:

Public event EventHandler Update;

使用委托:

Huhansan.Update+=new EventHandler(tongshi1.CloseStockMarket);

Huhansan.Update+=new EventHandler(tongshi2.CloseNBADirectSeeding);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: