命令模式

本文深入解析命令模式的设计理念,展示了如何通过将请求封装为对象,实现对象间的解耦,支持可撤销操作、日志和事务系统。通过具体的代码示例,讲解了命令模式在实际项目中的应用。

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

命令模式:将请求封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销操作。

命令模式将发出请求的对象和执行请求的对象解耦,被解耦的对象是通过命令对象进行沟通的。命令对象封装了接收者一个或一组的动作。撤销的实现是实现一个undo函数来回到execute之前的状态(多次撤销可以用堆栈来存储状态)。命令模式也能来实现日志和事务系统。

日志的应用:
日志系统需要我们将所有的动作都记录在日志中,并且能在系统死机过后,重新调度这些动作来恢复到之前的状态。通过新增两个方法(store、load),命令模式就可以支持日志应用。

代码:

Command.h

#pragma once
#include <iostream>
#include <vector>
using namespace std;
class Barbecuer
{
public:
	void BakeOne() { cout << "BakeOne" << endl; }
	void BakeSec() { cout << "BakeSec" << endl; }
};
class Command
{
public:
	Command(Barbecuer* pp):p(pp){}
	virtual void execute() = 0;
protected:
	Barbecuer* p;
};
class BakeOne :public Command
{
public:
	BakeOne(Barbecuer* pp):Command(pp) { p = pp; }
	void execute() {
		p->BakeOne();
	}
};
class BakeSec :public Command
{
public:
	BakeSec(Barbecuer* pp) :Command(pp) { p = pp; }
	void execute() {
		p->BakeSec();
	}
};
class Waiter {
public:
	void Order(Command* pp) { List.push_back(pp); }
	void Notify() {
		vector<Command*>::iterator iter;
		for (iter = List.begin(); iter != List.end(); iter++)
		{
			(*iter)->execute();
		}
	}
private:
	vector<Command*> List;

};

**

Command.cpp

**

#include <iostream>
#include "Command.h"
using namespace std;
int main()
{
	Barbecuer* p=new Barbecuer;
	BakeOne* b1 = new BakeOne(p);
	BakeSec* b2=new BakeSec(p);
	Waiter* w=new Waiter;
	w->Order(b2);
	w->Order(b1);
	w->Notify();
	delete b1;
	delete b2;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值