Command design pattern

本文介绍了命令模式,它允许将请求封装为对象,从而可以按需参数化客户端,支持请求队列和撤销操作。通过ConcreteCommand类的receiver列表,实现了对不同接收者对象的存储和调用,类似于Qt的信号和槽机制,或者事件驱动和回调函数。在示例中,ConcreteReceiver和ConcreteCommand展示了如何创建和执行命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Command:Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations.把請求封裝起來,這樣就可以按照顧客的需要把顧客的請求作爲參數,封裝起來,並且可以撤銷請求;
這是一個處理參數的設計模式,也就是原本的參數是固定的,但是現在變成了可變的參數;
在这里插入图片描述
這個和qt的信號和槽很像,發送的參數可以不同,但是類型是一樣的,然後接受參數的進行動作;也就是和事件機制,回調函數等類似;也就是ConcreteCommand中有自己的receiver列表,存儲了多個receiver;

CommandPatternTest.h:

#pragma once
#include<iostream>
#include<vector>
class Receiver
{
public :
	Receiver()
	{
		std::cout << "base receiver\n";
	}
	virtual void Action()
	{
		std::cout << "bace receiver action\n";
	}
	virtual ~Receiver()
	{
		std::cout << "base receiver release\n";
	}
};

class CommandPatternTest
{
public :
	virtual void Execute()
	{

	}
	virtual void AddReceiver(Receiver receiver)
	{

	}
};

class ConcreteReceiver : public Receiver
{
public:
	ConcreteReceiver()
	{
		std::cout << "ConcreteReceiver\n";
	}
	void Action()
	{
		std::cout << "ConcreteReceiver action\n";
	}
	~ConcreteReceiver()
	{
		std::cout << "ConcreteReceiver release\n";
	}
};
class ConcreteCommand : public CommandPatternTest
{
public:
	void Execute()
	{
		/*for (auto receiver : receiver_list_)
		{
			std::cout << "action\n";
			receiver.Action();
		}	*/
		for (int i = 0; i < receiver_list_.size(); i++)
		{
			receiver_list_[i]->Action();
		}
	}
	void AddReceiver(Receiver* receiver)
	{
		std::cout << "add receiver\n";
		//receiver.Action();
		receiver_list_.push_back(receiver);
	}
private:
	std::vector<Receiver*> receiver_list_;
};

main:

#include"CommandPatternTest.h"
int main()
{
	ConcreteReceiver receiver;
	ConcreteCommand command;
	command.AddReceiver(&receiver);
	command.Execute();
	return 0;
}

結果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值