C++观察者模式

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

///加深点印象

///定义了事件类型
///业务类可以根据事件类型来判断那条消息需要处理, 不需要的消息就过滤掉
///业务类只有一个收到消息的入口就是OnEvent函数,如果使用单例模式的话,以后开出接口的机会一定会越来越多
typedef enum Event
{
    event1 = 1,        ///事件1
    event2,            ///事件2
    event3,            ///事件3
}Event;

///定义了一个基类IObserver,有一个虚函数OnEvent
class IObserver
{
public:
    virtual void OnEvent(Event event, std::string str/*, const Json::Value& value*/){}
};

///业务类A,继承了IObserver,实现了虚函数OnEvent函数
class A : public IObserver
{
public:
    void OnEvent(Event event, std::string str/*, const Json::Value& value*/)
    {
        ///业务A类处理了事件event1的消息
        if (event == event1)
        {
            cout << "class A recv Message: "<< str << endl;
        }
    }
};

///业务类B,继承了IObserver,实现了虚函数OnEvent函数
class B : public IObserver
{
public:
    void OnEvent(Event event, std::string str/*, const Json::Value& value*/)
    {
        ///业务B类处理了事件event2的消息
        if (event == event2)
        {
            cout << "class B recv Message: "<< str << endl;
        }
    }
};

///Manager类有一个存放IObserver类型指针的数组
class Manager
{
public:
    ///Attach函数的参数是IObserver指针类型,只要继承了IObserver类型的对象指针都能存放到数组中
    void Attach(IObserver* observer)
    {
        vector<IObserver*>::iterator it = find(v.begin(), v.end(), observer);
        if (it == v.end())
        {
            v.push_back(observer);
        }
    }

    ///Detach函数是把IObserver类型的对象指针从数组中删除
    void Detach(IObserver* observer)
    {
        vector<IObserver*>::iterator it = find(v.begin(), v.end(), observer);
        if (it != v.end())
        {
            v.erase(it);
        }
    }

    ///这是一个运算符重载函数(重载了小括号运算符)
    ///使用方法:用Mananger类定义一个对象m, 就可以这样调用m(event1, "111");
    ///将消息发送给每个继承了IObserver类并且实现了OnEvent接口的业务类
    void operator()(Event event, string str)
    {
        ///这里将消息发送给不同的业务类,业务类根据事件Event进行消息处理
        for(size_t i = 0; i < v.size(); i++)
        {
            v[i]->OnEvent(event, str);
        }
    }

    size_t GetSize()
    {
        return v.size();
    }

private:
    vector<IObserver*> v;
};

int main()
{
    A a;

    B b;

    Manager m;

    ///将业务类A, 业务类B的对象指针注册到Mananger类的数组中
    m.Attach(&a);
    m.Attach(&b);

    cout << m.GetSize() << endl;

    ///这是一个运算符重载函数(重载了小括号运算符)
    ///使用方法:用Mananger类定义一个对象m, 就可以这样调用m(event1, "111");
    ///调用的函数是类Manager的operator()函数
    m(event1, "hello");
    m(event2, "hello");

    ///将业务类A对象指针从Manager的数组中删除
    m.Detach(&a);

    cout << m.GetSize() << endl;

    return 0;
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 C++ 观察者模式实现的代码示例: ``` #include <iostream> #include <vector> using namespace std; class Observer { public: virtual void update() = 0; }; class Subject { private: vector<Observer*> observers; public: void attach(Observer* observer) { observers.push_back(observer); } void detach(Observer* observer) { observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end()); } void notify() { for (Observer* observer : observers) { observer->update(); } } }; class ConcreteObserver1 : public Observer { public: void update() { cout << "ConcreteObserver1 received the update." << endl; } }; class ConcreteObserver2 : public Observer { public: void update() { cout << "ConcreteObserver2 received the update." << endl; } }; class ConcreteSubject : public Subject { public: void doSomething() { cout << "ConcreteSubject is doing something." << endl; notify(); } }; int main() { ConcreteSubject subject; ConcreteObserver1 observer1; ConcreteObserver2 observer2; subject.attach(&observer1); subject.attach(&observer2); subject.doSomething(); subject.detach(&observer2); subject.doSomething(); return 0; } ``` 在这个实现中,我们定义了一个 Observer 接口和一个 Subject 类。具体的观察者 ConcreteObserver1 和 ConcreteObserver2 实现了 Observer 接口,而具体的被观察者 ConcreteSubject 继承了 Subject 类。 ConcreteSubject 类中有一个 doSomething() 方法,它会触发 notify() 方法,通知所有注册过的观察者。被观察者可以通过 attach() 方法注册观察者,detach() 方法注销观察者。 在 main() 函数中,我们创建了 ConcreteSubject 和两个 ConcreteObserver 的实例,注册了这两个观察者,然后调用 doSomething() 方法触发通知。我们还演示了如何注销一个观察者,然后再次触发通知。 这个简单的实现可以帮助你理解观察者模式的基本原理和实现方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值