观察者
(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图如下:
![](https://i-blog.csdnimg.cn/blog_migrate/7ad117d8fd04b4a9f6c1058e310089a8.jpeg)
观察者
(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。
被观察
被观察对象发生了某种变化(如图中的SomeChange),从容器中得到所有注册过的观察者,将变化通知观察者。
撤销观察
观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。
观察者将自己注册到被观察者的容器中时,被观察者不应该过问观察者的具体类型,而是应该使用观察者的接口。这样的优点是:假定程序中还有别的观察者,那么只要这个观察者也是相同的接口实现即可。一个被观察者可以对应多个观察者,当被观察者发生变化的时候,他可以将消息一一通知给所有的观察者。基于接口,而不是具体的实现——这一点为程序提供了更大的灵活性。