首页 > 其他分享 >命令模式实现撤销和重做机制

命令模式实现撤销和重做机制

时间:2024-11-15 14:20:08浏览次数:1  
标签:undoneCommands int void executedCommands value amount 模式 撤销 机制

#include <vector>
#include <iostream>

//定义命令接口
class Command 
{
public:
	virtual void execute() = 0;
	virtual void undo() = 0;
};

//实现“增加”命令类
class IncreaseCommand : public Command 
{
private:
	int* _value;
	int _amount;
public:
	IncreaseCommand(int* value, int amount) : _value(value), _amount(amount) 
	{

	}

	void execute() override 
	{
		*_value += _amount; 
	}
	
	void undo() override 
	{ 
		*_value -= _amount; 
	}
};

//实现“减少”命令类
class DecreaseCommand : public Command 
{
private:
	int* _value;
	int _amount;
public:
	DecreaseCommand(int* value, int amount) : _value(value), _amount(amount) 
	{

	}

	void execute() override 
	{
		*_value -= _amount; 
	}

	void undo() override 
	{
		*_value += _amount; 
	}
};

//实现命令管理器
class CommandManager 
{
private:
	std::vector<Command*> _executedCommands;
	std::vector<Command*> _undoneCommands;
public:
	CommandManager() {}
	~CommandManager()
	{
		for (auto& cmd : _executedCommands)
		{
			delete cmd;
		}

		for (auto& cmd : _undoneCommands)
		{
			delete cmd;
		}
	}

	void execute(Command* command) 
	{
		command->execute();
		_executedCommands.push_back(command);
		_undoneCommands.clear(); // 清除重做命令列表
	}

	void undo() 
	{
		if (!_executedCommands.empty()) 
		{
			Command* lastCommand = _executedCommands.back();
			lastCommand->undo();
			_undoneCommands.push_back(lastCommand);
			_executedCommands.pop_back();
		}
	}

	void redo() 
	{
		if (!_undoneCommands.empty()) 
		{
			Command* lastCommand = _undoneCommands.back();
			lastCommand->execute();
			_executedCommands.push_back(lastCommand);
			_undoneCommands.pop_back();
		}
	}
};


int main()
{
	int value = 10;
	CommandManager manager;

	// 增加 5
	manager.execute(new IncreaseCommand(&value, 5));
	std::cout << "Value: " << value << std::endl; // 输出: 15

	// 减少 3
	manager.execute(new DecreaseCommand(&value, 3));
	std::cout << "Value: " << value << std::endl; // 输出: 12

	// 撤销
	manager.undo();
	std::cout << "Value: " << value << std::endl; // 输出: 15

	// 重做
	manager.redo();
	std::cout << "Value: " << value << std::endl; // 输出: 12

	return 0;
}

  

标签:undoneCommands,int,void,executedCommands,value,amount,模式,撤销,机制
From: https://www.cnblogs.com/kuaixue/p/18547901

相关文章

  • Oracle用户管理模式下的备份恢复
    Oracle用户管理模式下的备份恢复1、用户管理模式下的冷备份1.1查询数据库相关信息查实例selectinstance_name,version,status,archiver,database_statusfromv$instance;查数据库selectdbid,name,log_modefromv$database;查数据文件状态selectfile_name,tabl......
  • 国标GB28181软件LiteGBS国标GB28181-2022平台夜晚IPC灯光导致不能切换黑白模式且图像
    LiteGBS国标GB28181网页直播平台具有诸多显著特点。首先,它全力支持设备以GB28181协议接入,这意味着能够广泛接纳符合该协议标准的各类设备,为用户提供了丰富的设备选择空间。接入设备后,LiteGBS可对视频进行高效的解码、处理和分发等服务,确保视频信号的稳定传输和高质量呈现。在兼......
  • 标签显示模式
    标签显示模式:CSS布局与显示控制核心知识标签的显示模式是网页设计中CSS(层叠样式表)的一个重要概念,它决定了HTML元素在页面上的布局和显示方式。以下是标签显示模式所有相关的重要基础知识点:一、标签显示模式的概念标签显示模式,也称为元素的显示模式或盒模型显示类型,是指HT......
  • linux: Out-Of-Memory Killer 机制了解
    在Linux操作系统中,内存管理是确保系统稳定性和性能的关键环节。当系统内存耗尽时,Linux内核会启动一种称为OOMKiller(Out-Of-MemoryKiller)的机制,以选择并终止某些进程,释放内存资源,防止系统崩溃。一、OOMKiller的背景Linux内核采用了内存过度提交(Overcommit)的策略,即允许......
  • Anthropic公司CEO达里奥·阿莫代伊(Dario Amodei)深入探讨了通用人工智能(AGI)、AI安全性
      每周跟踪AI热点新闻动向和震撼发展想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行!订阅:https://......
  • 知识管理驱动,打造企业知识中台业务管理新模式
    在数字化时代,知识已成为企业最宝贵的资产之一。如何高效地管理、整合和利用知识资源,成为企业提升竞争力、实现可持续发展的关键。知识管理驱动的企业知识中台业务管理新模式,正是为了应对这一挑战而诞生的。本文将深入探讨知识管理在打造企业知识中台过程中的核心价值、实施路径及......
  • 浅学AI笔记03:一个Transformer自注意力机制的故事
    ChatGPT、百度文心一言等同类的大模型,都使用了Transformer架构,Transformer最大的特点是其有一个“自注意力机制”,搬个定义说的是:允许模型在处理每个输入元素时,能够考虑其与序列中所有其他元素之间的相关性,从而动态调整其权重。白话来说,就是模型要先理解输入句子的含义,才能......
  • 14.策略者模式设计思想
    14.策略者模式设计思想目录介绍01.策略模式基础介绍1.1策略模式由来1.2策略模式定义1.3策略模式场景1.4策略模式思考1.5策略模式的重心1.6理解策略唯一性1.7主要解决的问题02.策略模式原理2.1罗列一个场景2.2用例子理解策略2.3需求普通实现2.4案例......
  • Python注意力机制Attention下CNN-LSTM-ARIMA混合模型预测中国银行股票价格|附数据代码
    全文链接:https://tecdat.cn/?p=38195原文出处:拓端数据部落公众号 股票市场在经济发展中占据重要地位。由于股票的高回报特性,股票市场吸引了越来越多机构和投资者的关注。然而,由于股票市场的复杂波动性,有时会给机构或投资者带来巨大损失。考虑到股票市场的风险,对股价变动的研究......
  • 2024/11/14日 日志 关于 MVC 分层开发模式
    MVC是一种分层开发的模式,是我们在完成项目时常用的开发模式。点击查看代码--MVC模式--MVC是一种分层开发的模式,其中:--M:Model,业务模型,处理业务--V:View,视图,界面展示--C:Controller,控制器,处理请求,调用模型和视图----MVC好处--职责单一,互不影响--有利于分......