设计模式 观察者模式

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;
}

总结流程:

被观察者提供注册接口(需要传入对象的实例)------>被观察者需要通知已经订阅了的对象---->删除注册了的对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值