- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1意图定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。2别名依赖(Dependents), 发布-订阅(Publish-Subscribe)3动机将一个系统分割成一系列相互协作的类有一个常见的副作用:需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,因为这样降低了他们的可重用性。4实用性1、当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将二者封装在独立的对象中以使他们可以各自独立的改变和复用。2、当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象待改变。3、当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之,你不希望这些对象是紧密耦合的。5结构6参与者1、Subject(目标)—目标知道它的观察者。可以有任意多个观察者观察同一个目标。—提供注册和删除观察者对象的借口。2、Observer(观察者)—为那些在目标发生改变时需获得通知的对象定义一个更新接口。3、ConcreteSubject(具体目标)—将有关状态存入各ConcreteObserver对象。—当它的状态发生改变时,向它的各个观察者发出通知。4、ConcreteObserver(具体观察者)—维护一个指向ConcreteSubject对象的引用。—存储有关状态,这些状态应与目标的状态保持一致。—实现Observer的更新接口以使自身状态与目标的状态保持一致。7优缺点1、使目标和观察者之间的耦合是抽象的最小的。2、支持广播通信3、意外的更新因为一个观察者并不知道其它观察者的存在,它可能对改变目标的最终代价一无所知。在目标上一个看视无害的操作可能会引起一系列对观察者以及依赖这些观察者的那些对象的更新。此外,如果依赖准则的定义或维护不当,常常会引起错误的更新,这种错误通常很难补捉。代码实例本例子简单的模拟车辆运行和红绿灯的关系。例子中实现了一个Signallamp的基类(observer),凡是继承这个基类的类都可以观察红绿灯信息,并让(concreteObserver)类Vehicle,继承Signallamp。实现了一个subject的基类,凡是继承subject的concretesubject都可以被继承Signallamp的具体观察者观察,并实现子类TrafficSignal。在客户端我们实现了几辆车在运行,当红绿灯变化时,有观察红绿灯的车将收影响。如图所以:这里图片没有说明什么,但可以方便我们想象到客户端场景。许多车在不断的移动,当变成红灯的时候,那些观察TrafficSignal事件的车辆将停止移动,而没有观察该事件的车将不受影响。observer.h中代码如下:#ifndef _OBSERVER_#define _OBSERVER_#include iostreamusingnamespace std;void gotoxy(int x,int y);enum Signallamp{RedSignal, GreenSignal};class ObserverTrafficSignal{public: ObserverTrafficSignal(){}virtualvoid updataSignal(Signallamp signal) = 0;};class Vehicle: public ObserverTrafficSignal{public: Vehicle(int px, int py):_pointx(px), _pointy(py){isRed = false;}void drawVehicle();void clearVehicle();void updataposition();void setmovestep(int stepx, int stepy);virtualvoid updataSignal(Signallamp signal);private:int _pointx;int _pointy;int _move_x;int _move_y;int _save_movex;int _save_movey;bool isRed;};#endifobserver.cpp中的代码如下:#include observer.h#include iostreamusingnamespace std;#includewindows.hvoid gotoxy(int x,int y){ COORD coord={x,y}; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);}void conceal_cursor(){ CONSOLE
文档评论(0)