本文共 2443 字,大约阅读时间需要 8 分钟。
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听摸一个主题对象,这个主题对象在状态发生变化的时候,会通知所有观察者对象,使他们能够自动更新自己。
观察者模式的特点:
将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象之间的一致性,我们不希望为了维护一致性而使各类紧密耦合,这样会给维护、扩展和重用带来不变。 而观察者的关键对象是主题Subject 和观察者 Observer ,一个Subject 可以有任意数量的依赖它的 Observer , 一旦Subject的状态发生了改变,所有的Observer 都可以收到通知,Subject发出通知的时候,并不需要知道谁是它的观察者,也就是说,具体的观察者是谁,它根本不知道。而任何一个观察者也不需要直到其他观察者的存在什么时候使用观察者模式呢?
当一个对象的改变需要同时改变其他的对象的时候,而且他不知道具体有多少对象需要改变时。当一个抽象模型有两个方面,其中一个方面依赖于另一个方面,常用到观察者模式观察者模式所做的工作其实就是在解除耦合,让耦合双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化
观察者模式的效果有以下的优点:
观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。
观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知,
观察者模式有下面的缺点:
如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察者模式是要特别注意这一点。
如果对观察者的通知是通过另外的线程进行异步投递的话,系统必须保证投递是以自恰的方式进行的。
虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化的。
#include#include #include #include using namespace std;class Observer;//通知者class Subject{ public: virtual void addth(Observer &ob) = 0; virtual void delth(Observer &ob) = 0; virtual void notify() = 0; virtual string getAction() = 0; virtual void setAction() = 0;};//观察者class Observer{ public: virtual void update(){ }};class CreateSubject:public Subject{ public: CreateSubject(string n):Name(n){ } //添加观察者 void addth(Observer &ob) { _observer.push_back(&ob); } //删除观察者 virtual void delth(Observer &ob) { auto it = find(_observer.begin(), _observer.end(),&ob); if(it != _observer.end()) { _observer.erase(it); } } //消息通知 virtual void notify() { for(auto val:_observer) { val->update(); } } string getAction() { return Action; } virtual void setAction() { Action = " 老板来了 "; } protected: vector _observer; private: string Action; string Name;};class CreateObserver:public Observer{ public: CreateObserver(string n, CreateSubject &s):Name(n) { _subject = &s; Name = n; } void update() { ObserverState = _subject->getAction(); cout << Name << ObserverState << " 修改状态认真工作 " << endl; } private: Subject *_subject; string ObserverState; string Name;};int main(){ CreateSubject *boss = new CreateSubject("胡汉三"); Observer *employe1 = new CreateObserver("员工1",*boss); Observer *employe2 = new CreateObserver("员工2",*boss); boss->addth(*employe1); boss->addth(*employe2); boss->setAction(); boss->notify(); return 0;}
转载地址:http://rxnwi.baihongyu.com/