设计模式读书笔记:Command(命令)

意图:

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。

结构图:来自 《23种设计模式 - 郗晓勇》


实现:https://github.com/panshiqu/patterns/tree/master/Command

Command

namespace NS_COMMAND {

class Command {
public:
	Command() {}
	virtual ~Command() {}
	virtual void execute(void) = 0;
};

template <class TReceiver>
class SimpleCommand : public Command {
public:
	typedef void (TReceiver:: *Action)();
	SimpleCommand(TReceiver *tr, Action act) : _treceiver(tr), _action(act) {}
	virtual void execute(void);
private:
	TReceiver *_treceiver;
	Action _action;
};

template <class TReceiver>
void SimpleCommand<TReceiver>::execute() {
	(_treceiver->*_action)();
}

} /* namespace NS_COMMAND */
ConcreteCommand

#include "Receiver.h"

namespace NS_COMMAND {

class ConcreteCommand {
public:
	ConcreteCommand(Receiver *receiver) : _receiver(receiver) {}
	virtual ~ConcreteCommand() {}
	virtual void execute(void)
	{
		_receiver->action();
	}

private:
	Receiver *_receiver;
};

} /* namespace NS_COMMAND */
Receiver
#include <iostream>

namespace NS_COMMAND {

class Receiver {
public:
	Receiver() {}
	virtual ~Receiver() {}
	void action(void)
	{
		std::cout << "Receiver Action." << std::endl;
	}
};

} /* namespace NS_COMMAND */
main

#include "Command/Command.h"
#include "Command/Receiver.h"
#include "Command/ConcreteCommand.h"
using namespace NS_COMMAND;
int main(void)
{
	Receiver r;
	ConcreteCommand cc(&r);
	cc.execute();

	// 使用模板创建简单命令
	SimpleCommand<Receiver> sc(&r, &Receiver::action);
	sc.execute();
}
附加:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值