c++设计模式(观察者模式2)--事件委托C++实现

普通的观察者模式:

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

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值