定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

2别名

依赖(Dependents), 发布-订阅(Publish-Subscribe)

3动机

将一个系统分割成一系列相互协作的类有一个常见的副作用:需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,因为这样降低了他们的可重用性。

4实用性

1、当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将二者封装在独立的对象中以使他们可以各自独立的改变和复用。

2、当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象待改变。

3、当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之,你不希望这些对象是紧密耦合的。

5结构

 

观察者模式(observer)c++实现

7优缺点

1、使目标和观察者之间的耦合是抽象的最小的。

2、支持广播通信

3、意外的更新    因为一个观察者并不知道其它观察者的存在,它可能对改变目标的最终代价一无所知。在目标上一个看视无害的操作可能会引起一系列对观察者以及依赖这些观察者的那些对象的更新。此外,如果依赖准则的定义或维护不当,常常会引起错误的更新,这种错误通常很难补捉。

--以上内容来自《可复用面向对向软件的基础》

 

代码实例:

本例子简单的模拟车辆运行和红绿灯的关系。例子中实现了一个Signallamp的基类(observer),凡是继承这个基类的类都可以观察红绿灯信息,并让(concreteObserver)类Vehicle,继承Signallamp。实现了一个subject的基类,凡是继承subject的concretesubject都可以被继承Signallamp的具体观察者观察,并实现子类TrafficSignal。

在客户端我们实现了几辆车在运行,当红绿灯变化时,有观察红绿灯的车将收影响。如图所以:

观察者模式(observer)c++实现

这里图片没有说明什么,但可以方便我们想象到客户端场景。许多车在不断的移动,当变成红灯的时候,那些观察TrafficSignal事件的车辆将停止移动,而没有观察该事件的车将不受影响。

1、observer.h中代码如下:

#ifndef _OBSERVER_
#define _OBSERVER_

#include <iostream>
using namespace std;

void gotoxy(int x,int y);

enum Signallamp{RedSignal, GreenSignal};

class ObserverTrafficSignal{
public:
    ObserverTrafficSignal(){}
    virtual void 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);

    virtual void updataSignal(Signallamp signal);

private:
    int _pointx;
    int _pointy;
    int _move_x;
    int _move_y;
    int _save_movex;
    int _save_movey;
    bool isRed;
};

#endif
observer.h

相关文章:

  • 2021-08-31
  • 2021-06-22
  • 2021-12-28
  • 2021-08-11
  • 2021-05-03
  • 2021-11-08
  • 2021-12-20
猜你喜欢
  • 2022-02-20
  • 2021-12-08
  • 2022-12-23
  • 2022-12-23
  • 2021-06-12
  • 2021-05-28
  • 2021-11-14
相关资源
相似解决方案