观察者模式,让一个对象观察另一个对象的状态

观察者

(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。

被观察

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

撤销观察

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

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

(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。 观察者模式的作用是:当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。
观察者模式 有时又被称为 发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式。

我在面试的时候被问道观察者模式、MVC,结果没反应过来。
在PPTV被问道点击事件是怎么传给图形界面的,我也没理解他在问这个问题,后来才恍然大悟,估计被鄙视了。
这片文章也算是顺便证明一下我对设计模式的理解深度吧,我敢肯定的说,你们错过了一个C++高手。

在C++的许多库实现中、在MVC模型中、在博客订阅系统中,都使用了观察者模式。
对C++而言,这个模式最大的用处在于 为C++添加事件概念(比如C#就直接在语法层面提供了事件的概念) ,像 object-c和JAVA提供委托,也是为了支持事件机制。

在《UNIX编程艺术》中提到软件设计最重要的是正交,解耦。作为UNIX程序员我原本只知道这么告诉别人“数据与逻辑分离”、“将策略和机制分开”,后来应用程序界面设计者就是告诉我:这个东西是符合“Model-View-Control”的,然后我整理了一下才明白MVC也是观察者模式的一种机制.

好了,我们省事一点,改百度百科的代码吧。
原地址:
http://baike.baidu.com/view/1854779.htm

业务逻辑是:在MVC中, 用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。
UML图如下:

观察者

(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。

被观察

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

撤销观察

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值