行为模式-观察者模式

         观察者模式(Observer) 定义对象间的一对多个关系,当一个对象的状态发生变化时,所以依赖它的对象都会得到通知,并自动更新.

         观察者模式完美的将观察者和被观察的对象分离开,举个例子:用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上.面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面.一个对象只做一件事情,并且将他做好.观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和可重用性.

观察者模式有很多实现方式,从根本上说,该模式必须包含两个角色:观察者和被观察对象.在刚才的例子中,业务数据是被观察对象,用户界面是观察者.观察者和被观察者之间存在“观察”的逻辑关系,当被观察者发生改变的时候,观察者就会观察到这样的变化,并且做出相应的响应.如果在用户界面、业务数据之间使用这样的观察过程,可以确保界面和数据之间划清界限,假定应用程序的需求发生变化,需要修改界面的表现,只需要重新构建一个用户界面,业务数据不需要发生变化.

实现观察者模式的时候要注意,观察者和被观察对象之间的互动关系不能体现成类之间的直接调用,否则就将使观察者和被观察对象之间紧密的耦合起来,从根本上违反面向对象的设计的原则.无论是观察者“观察”观察对象,还是被观察者将自己的改变“通知”观察者,切忌都不应该直接调用.

实现观察者模式有很多形式,比较直观的一种是使用一种“注册—通知—撤销注册”的形式:

观察者将自己注册到被观察对象中,被观察对象将观察者存放在一个容器里.

被观察对象发生了某种变化.从容器中得到所有注册过的观察者,将变化通知观察者.

观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除.

观察者将自己注册到被观察者的容器中时,被观察者不应该过问观察者的具体类型,而是应该使用观察者的接口.这样的优点是:假定程序中还有别的观察者,那么只要这个观察者也是相同的接口实现即可.一个被观察者可以对应多个观察者,当被观察者发生变化的时候,他可以将消息一通知给所有的观察者.基于接口,而不是具体的实现,这一点为程序提供了更大的灵活性.例如:

    public interface IObserver

    {

        void Notify(object obj);

    }   // interface IObserver

 

    public class Observer : IObserver

    {

        public void Notify(object obj)

        {

        }

    }   // class Observer

 

    public interface IObservable

    {

        void Register(IObserver obj);

        void UnRegister(IObserver obj);

    }   // interface IObservable

 

    public class Observable : IObservable

    {

        private List<IObserver> m_List = new List<IObserver>();

 

        public void Register(IObserver obj)

        {

            m_List.Add(obj);

        }

 

        public void UnRegister(IObserver obj)

        {

            m_List.Remove(obj);

        }

 

        public void NotifyObserver(object obj)

        {

            foreach (var v in m_List)

            {

                v.Notify(obj);

            }

        }

    }   // class Observable

 

    public class DataObject : Observable

    {

        private int m_key;

        public int TicketKey

        {

            set

            {

                m_key = value;

                NotifyObserver(m_key);

            }

        }

    }   // class DataObject

上面的形式中我们用一种最基本的方式实现了观察者模式,我们为观察者模式开发了一种特定的类型..NET框架中,使用委托以及事件,可以更好的实现观察者模式.

在事件的模式下,声明事件的类就是被观察者.被观察者不需要实现对观察者的注册,只需要公开一个事件,而不实行任何操作.被观察者也不需要将自己注册到观察对象中,而是要创建一个特定的代理的实例,将这个代理绑定到某个方法上.用这样的方式注册或者撤销观察者对观察对象的观察.仔细研究委托和事件的模式就不难发现,IObserverIObservable接口的方法可以减少观察者和观察对象之间的耦合,而委托和事件几乎消除了这两个模块之间的耦合,灵活性提高了很多.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值