Object: 目标
ObjectCake: 具体目标
Observer: 观察者
ConcreteObserver_1: 具体观察者
可想象一个场景具体观察者(ConcreteObserver_1)狗,猫,鸭子在看一个具体目标(ObjectCake),然后要看ObjectCake,
1. 需要具体的观察者ConcreteObserver_1去向ObjectCake注册(registerObserver)
2.当ObjectCake内容变化,通知给注册到了vector中的对象(notifyObserver)
3.ObjectCake不想观察者观察,于是删除对象(removeObserver)
具体实现如下:
#include <iostream>
#include <vector>
class Object;
class Observer {
public:
virtual std::string getObjectName() = 0;
virtual void updateDate(int value) = 0;
};
class ConcretObserver_1 : public Observer {
public:
ConcretObserver_1(std::string nm)
:name(nm) {
}
virtual std::string getObjectName() {
return name;
};
void updateDate(int tmp) {
value = tmp;
std::cout << "[Observer]" << name << " get Data " << value << std::endl;
}
private:
std::string name;
int value;
};
class Object {
public:
virtual void registerObserver(Observer *obj) = 0;
virtual void removeObserver(Observer *obj) = 0;
virtual void notifyObserver() = 0;
};
class ObjectCake : public Object {
public:
void registerObserver(Observer* obj) override
{
objList.push_back(obj);
std::cout << "[obj] add ObjectCake: " << obj->getObjectName() << std::endl;
};
void removeObserver(Observer *obj) override
{
for (std::vector<Observer*>::iterator itr = objList.begin(); itr != objList.end(); itr++ ) {
if (*itr == obj) {
std::cout << "[obj] remove ObjectCake: " << obj->getObjectName() << std::endl;
objList.erase(itr);
}
}
};
void notifyObserver() override
{
value = objList.size();
for (auto tmp : objList)
{
tmp->updateDate(value);
}
};
private:
std::vector <Observer*> objList;
int value;
};
int main() {
Object* tmp = new ObjectCake;
tmp->registerObserver(new ConcretObserver_1("dark"));
tmp->notifyObserver();
std::cout << "====================\n" << std::endl;
Observer* dog = new ConcretObserver_1("dog");
tmp->registerObserver(dog);
tmp->registerObserver(new ConcretObserver_1("cat"));
tmp->notifyObserver();
std::cout << "====================\n" << std::endl;
tmp->removeObserver(dog);
tmp->notifyObserver();
printf("over\n");
return 0;
}
总结流程:
被观察者提供注册接口(需要传入对象的实例)------>被观察者需要通知已经订阅了的对象---->删除注册了的对象。