行为型 命令模式

简介: 行为型 命令模式

命令模式(Command Pattern):种数据驱动的设计模式。请求以命令的形式包裹在对象中,将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。

命令模式

概要分析:

实现了发送者和接收者的完全解耦,

1:可以定义一个命令基类,统一接口,供不同的子类处理不同的命令,以及提供统一接口调用。

2:可以定义一个命令的管理类,根据不同的输入内容,构造不同的具体类,调用执行单个命令。

也可以管理一系列的命令,统一一次执行。

定义命令类,存储命令,定义命令的行为==》基类的方式,保存不同的动作

命令的执行者类,

命令的管理者: 存储命令,执行命令==》真正调度

适用场景:

系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。

系统需要在不同的时间指定请求、将请求排队和执行请求。

系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。

系统需要将一组操作组合在一起,即支持宏命令

源码Demo:

简单的命令模式,可以再加一个管理类,根据不同的入参构造不同的子类,使用更方便。

/****************************************************************************************************************
命令模式:
  说白了就是通过中间人专门去管理这个命令,将这个中间人称为管理命令类,由这个中间人完成指令的发送动作
适用于:
  是将一个请求封装为一个对象,从而使你可用不同的请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
实现方法:
  创建命令:
    内部构造使用对象注入技术,完成对象调用的绑架  +  executecommand接口定义
    不同的命令中完成命令的执行者函数
      (executecommand重写)+ executecommand(去调用具体执行者的函数) 
*****************************************************************************************************************/
#include<iostream>
#include<string>
#include<list>
using namespace std;
class barbecuer //执行指令的类
{
public:
  void bakemutton(){
    cout << "烤羊肉串" << endl;
  }
  void bakechickenwing(){
    cout << "烤鸡翅" << endl;
  }
};
class Command   //命令基类,既包含了命令基类的赋值,也定义了相关操作的接口
{
protected://命令类很关键的一步是,告诉大家谁去接受这个指令
  barbecuer *receiver;//类的包含
public:
  Command(barbecuer*receiver) //命令类很关键的一步是,告诉大家谁去接受这个指令
  {  
    this->receiver = receiver;
  }
  virtual void executecommand() = 0;
};
//不同的命令执行1
class bakermuttoncommand :public Command //命令传送者
{
public:
  bakermuttoncommand(barbecuer*receiver) :Command(receiver){}
  void executecommand(){
    receiver->bakemutton();
  }//执行烤羊肉串
};
//不同的命令执行2
class bakechikenwingcommand :public Command //命令传送者
{
public:
  bakechikenwingcommand(barbecuer*receiver) :Command(receiver){}
  void executecommand(){
    receiver->bakechickenwing();
  }//执行烤鸡翅
};
class waiter //服务员单一,一次只能给一个对象下达指令
{
private:
  Command *command;
public:
  void setorder(Command*command) //对象注入技术,对象的赋值
  {
    this->command = command;
  }
  void notify(){
    command->executecommand();
  }
};
//这个类对单一服务员的时候,可有可无。只是为了说明下面的超级服务员做铺垫
class waiter2  //超级服务员,通过list可以给多个对象下达命令进行操作
{
private:
  list<Command*>orders;
public:
  void setorder(Command*command){
    orders.push_back(command);
  }
  void cancelorder(Command *command){}
  void notify()
  {
    list<Command*>::iterator iter = orders.begin();
    while (iter != orders.end())
    {
      (*iter)->executecommand();
      iter++;
    }
  }
};
int main()
{
  barbecuer *boy = new barbecuer;//创建一个执行动作的对象
  Command *bm1 = new bakermuttoncommand(boy);//来一个命令创建一次,传送一次命令
  //在bakermuttoncommand里面完成对executecommand的操作
  //命令类,在基类中完成命令的执行者赋值(使用初始化列表)
  bm1->executecommand();
  Command *bm2 = new bakermuttoncommand(boy);
  Command *bc1 = new bakechikenwingcommand(boy);
  waiter2 *girl = new waiter2();//使用超级服务员,去管理这些个命令
  girl->setorder(bm1);
  girl->setorder(bm2);
  girl->setorder(bc1);
  girl->notify();
  // system("pause");
  delete boy;
  delete bm2;
  delete bm1;
  delete bc1;
  delete girl;
  return 0;
}
目录
相关文章
|
设计模式 敏捷开发 C++
行为型设计模式07-命令模式
行为型设计模式07-命令模式
40 0
|
2月前
|
设计模式 存储 C#
C# 一分钟浅谈:命令模式与职责链模式
【10月更文挑战第16天】本文介绍了命令模式和职责链模式两种行为设计模式。命令模式将请求封装成对象,支持可撤销操作;职责链模式将请求沿处理者链传递,支持动态添加或删除处理者。文章通过C#代码示例详细解释了这两种模式的核心组件、优点、缺点及常见问题,并提供了如何避免这些问题的建议。
38 5
|
3月前
|
设计模式 存储 算法
Java设计模式-命令模式(16)
Java设计模式-命令模式(16)
|
6月前
|
设计模式 Java
Java设计模式之命令模式详解
Java设计模式之命令模式详解
|
设计模式 Java
深入Java设计模式之命令模式
深入Java设计模式之命令模式
101 0
|
7月前
|
设计模式 存储 Java
Java设计模式-命令模式
命令(Command)模式是指将请求封装成为一个对象,使发出请求和执行请求的责任分割开,方便将命令对象进行存储、传递、调用、增加与管理。 也就是将发送者、接收者和调用命令封装成独立的对象,来供客户端调用。属于行为模式的一种。
77 1
Java设计模式-命令模式
|
设计模式 存储 测试技术
设计模式-行为型模式:命令模式
设计模式-行为型模式:命令模式
|
7月前
|
设计模式 存储 前端开发
【设计模式】之命令模式
命令模式是一种非常有用的设计模式,在前端开发中经常用于管理和执行操作。它通过将操作封装成对象,并将其作为参数传递、存储或记录,实现了优雅地管理和执行操作。通过使用命令模式,我们可以提高代码的可维护性和可扩展性。然而,在应用命令模式时需要权衡其带来的优缺点,并根据具体情况进行选择。
68 0
|
设计模式 Java
命令模式【Java设计模式】
命令模式【Java设计模式】
57 0
|
存储 Java 程序员
行为型模式-命令模式
行为型模式-命令模式
117 0