C++实现命令模式

概述:

命令模式是一种行为型模式,将一个请求封装成一个对象,从而可以用不同的请求对象进行参数化

优点:

  1. 降低命令请求端和接收端的耦合度

  2. 新的命令只需要封装成相应的对象,就可以添加到系统中,可扩展性好

缺点:

  1. 命令比较多的情况下,会导致创建过多的命令类

使用场景:

  1. 客户端有多个请求协议的情况下,可以将协议当做命令

UML类图:

C++实现命令模式_第1张图片

实例:

	#include 
	#include 
	// 炒菜
	class Cooking{
	public:
	       void cookPork(){
	              std::cout << "炒猪肉" << std::endl;
	       }
	       void cookBeef(){
	              std::cout << "炒牛肉" << std::endl;
	       }
	       void cookLamb(){
	              std::cout << "炒羊肉" << std::endl;
	       }
	};
	// 命令接口,菜单
	class AbstractCommand{
	public:
	       virtual void handle() = 0;
	};
	class cookPorkCommand : public AbstractCommand{
	public:
	       cookPorkCommand(Cooking* c){
	              this->c = c;
	       }
	       virtual void handle(){
	              this->c->cookPork();
	       }
	private:
	       Cooking* c;
	};
	class cookBeefCommand: public AbstractCommand{
	public:
	       cookBeefCommand(Cooking* c){
	              this->c = c;
	       }
	       virtual void handle(){
	              this->c->cookBeef();
	       }
	private:
	       Cooking* c;
	};
	class cookLambCommand: public AbstractCommand{
	public:
	       cookLambCommand(Cooking* c){
	              this->c = c;
	       }
	       virtual void handle(){
	              this->c->cookLamb();
	       }
	private:
	       Cooking* c;
	};
	// 厨师
	class Cooker{
	public:
	       void addOrder(AbstractCommand* command){
	              orders.push(command);
	       }
	       void cookeFood(){
	              while(!orders.empty()){
	                     AbstractCommand* command = orders.front();
	                     command->handle();
	                     orders.pop();
	              }
	       }
	public:
	       std::queue orders;
	};
	int main(){
	       Cooking* c = new Cooking();
	       cookPorkCommand* pork = new cookPorkCommand(c);
	       cookPorkCommand* beef = new cookPorkCommand(c);
	       cookLambCommand* lamb = new cookLambCommand(c);
	       Cooker* cooker = new Cooker();
	       cooker->addOrder(pork);
	       cooker->addOrder(beef);
	       cooker->addOrder(lamb);
	       cooker->cookeFood();
	       return 0;
	}

你可能感兴趣的:(C++,设计模式)