首页 > 其他分享 >命令模式

命令模式

时间:2022-09-21 22:34:33浏览次数:57  
标签:void 模式 命令 Command receiver girl public

理论

命令模式(Command),将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

 命令模式的优点:

  1. 能较容易地设计一个命令队列;

  2. 比较容易地将命令记入日志;

  3. 允许接受请求地一方决定是都要否决要求;

  4. 可以容易地实现对请求地撤销和重做;

  5. 由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分隔开。

实例

模拟路边烤肉串:‘行为请求者’与‘行为实现者’的紧耦合

       店内烤肉串:‘行为请求者’与‘行为实现者’的松耦合

UML类图

紧耦合设计:

客户端程序与烤肉串者紧耦合,尽管简单,但却极为僵化,有很多的隐患。在用户多,请求多的时候就容易乱。

送耦合设计:命令模式

代码实现

#include <iostream>
#include <list>
using namespace std;

//烤羊肉者  Receiver类
class Barbecuer {
public:
	void BakeMutton() {
		cout << "烤羊肉串!" << endl;
	}
	void BakeChickenWing() {
		cout << "烤鸡翅!" << endl;
	}
};

//抽象命令类
class Command {
public:
	Command(Barbecuer* receiver) {
		this->receiver = receiver;
	}
	virtual void ExcuteCommand() {}

protected:
	Barbecuer* receiver;
};

//具体命令类
class BakeMuttonCommand :public Command {
public:
	BakeMuttonCommand(Barbecuer* receiver) :Command(receiver) {}
	void ExcuteCommand() {
		receiver->BakeMutton();
	}
};
class BakeChickenWingCommand :public Command {
public:
	BakeChickenWingCommand(Barbecuer* receiver) :Command(receiver) {}
	void ExcuteCommand() {
		receiver->BakeChickenWing();
	}
};
 
//服务员  Invoker类
//只记录了一个命令
class Waiter {
public:
	//设置订单
	void SetOrder(Command* command) {
		this->command = command;
	}
	//通知执行
	void Notify() {
		command->ExcuteCommand();
	}

private:
	Command* command;
};
//维护一个命令队列,实现命令的添加、撤销、执行
class WaiterList {
public:
	void addCommand(Command* command){
		if (typeid(*command) == typeid(BakeChickenWingCommand)){
			cout << "服务员:鸡翅没有了,请点别的烧烤。" << endl;
		}
		else {
			commandList.push_back(command);
			cout << "增加订单: 烤羊肉" << endl;
		}
	}
	void cancelCommand(Command* command){
		commandList.remove(command);
	}
	void Notify() {
		for (Command* cmd : commandList){
			cout << endl;
			cout << "目前订单:" << endl;
			cmd->ExcuteCommand();
		}
	}

private:
	list<Command*> commandList;
};

int main()
{
	//开店前准备
	Barbecuer* boy = new Barbecuer();
	Command* bakeMuttonCommand1 = new BakeMuttonCommand(boy);
	Command* bakeMuttonCommand2 = new BakeMuttonCommand(boy);
	Command* bakeChickenWingCommand1 = new BakeChickenWingCommand(boy);
	Waiter girl;
	//开店营业
	girl.SetOrder(bakeMuttonCommand1);
	girl.Notify();
	girl.SetOrder(bakeMuttonCommand2);
	girl.Notify();
	girl.SetOrder(bakeChickenWingCommand1);
	girl.Notify();
	cout << "--------------------------------" << endl;

	WaiterList girl2;
	girl2.addCommand(bakeMuttonCommand1);
	girl2.addCommand(bakeMuttonCommand2);
	girl2.addCommand(bakeChickenWingCommand1);
	girl2.cancelCommand(bakeMuttonCommand2);
	girl2.Notify();

	return 0;
}

 运行结果:

 

标签:void,模式,命令,Command,receiver,girl,public
From: https://www.cnblogs.com/kyzh-lhl/p/16717402.html

相关文章

  • pip常用命令
    常用pip命令语句如下:#查看python版本# python#查看python安装路径# wherepython#查看pip版本及pip安装路径# pip-V#查pip安装的库的默认安装路径# python-msit......
  • 在输入shell命令的list_namespace时,报 :org.apache.hadoop.hbase.PleaseHoldException:
    今天弄了一下午这个问题,弄到了将近十点,终于解决了,终于解决这个问题了,感谢旭旭大佬相助,不再报错了。本来今天中午,我已经弄好了,结果我午睡了一下再看就报错了,哎。今天本来已......
  • linux-ls-l命令实现
    实现效果目的编写ls-l.c文件,将其编译为ls可执行程序。执行ls.exe时,后面加入文件参数,即可输出该文件的相关信息思路:通过main函数的参数获取用户传入的文件名通过st......
  • NAT模式下的虚拟机连接主机网络
    基于NAT模式的VMware虚拟机(LinuxCentOS7)连接主机(Windows11)网络一、什么是NAT模式虚拟机连接主机网络的三种方式:Bridged(桥接)NAT(网络地址转换)Host-Only(仅主机)NA......
  • 常用的Dos命令
    常用的Dos命令 #盘符切换#查看当前目录下的所有文件dir#切换目录cdchangedirectory#返回上一级目录cd..#清理屏幕cls(clearscreen)#退出终端exit#查看电脑IP......
  • 设计模式-创建型模式之单例
    1、元类实现1classSingleton(type):2def__init__(self,*args,**kwargs):3super().__init__(*args,**kwargs)4self._instance=Non......
  • Linux查看网速命令
    https://blog.csdn.net/HardProgrammer/article/details/124187035watch"ifconfigeth0|grepbyte"......
  • linux命令:chmod(常用方法详解)
     linuxchmod命令是在日常运维中比较常用的命令之一,对文件管理比较重要,如设置web目录时需设置特定的权限以保证服务器安全。提示:在写完shell脚本后,我们一般需要给这脚本设......
  • Linux常用命令大全
    系统信息arch显示机器的处理器架构(1)uname-m显示机器的处理器架构(2)uname-r显示正在使用的内核版本dmidecode-q显示硬件系统部件-(SMBIOS/DMI)hdparm-i/dev......
  • windows 2008 R2 断电重启进入修复模式
    windows2008R2意外断电重启进入修复模式 现在出现一个问题,就是当机房停电的时候,计算机自动进入到修复模式,当人不在机房的时候,容易造成服务器无法访问,我相信正常启动应......