普通的观察者模式:
https://blog.csdn.net/weixin_43272766/article/details/93915322
观察者模式(大话设计模式)-->事件委托C++实现
-
书中描述如下:
-
委托就是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有相同的行为委托方法的使用可以像其他任何方法一样,具有参数和返回值。委托可以看做是对函数的抽象,是函数的‘类’,委托的实例将代表一个具体的函数。
-
一个委托可以搭载多个方法,所有的方法被依次唤起
-
可以使委托对象所搭载的方法并不需要属于同一个类(个人认为这句话是重点!重点!)
大话这本书中的例子不是c++的,关于事件委托的实现我想了个办法。其中有一些问题,比如如何实现事件委托的对象,我第一个想到的是容器存储函数指针,但是成员函数指针貌似不能用啊,然后这几天看effective c++看到了bind,这个自从学了就没用过的技能,算是大致上实现了。
这个例子中,委托对象搭载的方法不属于一个类,甚至没有任何的联系,而且只是普通的成员函数,只是方法原型长得一样。
#include <iostream>
#include <string>
#include <functional>
#include <list>
using namespace std;
typedef function<void()> Action;
class ObserverA//观察者类A
{
public:
ObserverA() {}
virtual ~ObserverA() {}
virtual void ToStatusA()
{
cout << "执行动作A" << endl;
}
};
class ObserverB//观察者类B
{
public:
ObserverB() {}
virtual ~ObserverB() {}
virtual void ToStatusB()
{
cout << "执行动作B" << endl;
}
};
class Subject//主题/通知者
{
private:
list<Action*> acts;
public:
Subject() {}
virtual ~Subject() {}
//注册事件
void regist(Action *a)
{
acts.push_back(a);
}
//注销事件
void unregist(Action *a)
{
acts.remove(a);
}
void Notify()
{
for (auto act : acts)
{
(*act)();
}
}
};
int main()
{
ObserverA a;
Action acA = bind(&ObserverA::ToStatusA, &a);
ObserverB b;
Action acB = bind(&ObserverB::ToStatusB, &b);
Subject s;
s.regist(&acA);
s.regist(&acB);
s.Notify();
cout << "-----分割线-----" << endl;
s.unregist(&acA);
s.Notify();
getchar();
return 0;
}