设计模式之命令(Command)模式详解

【C++设计模式】Command 命令模式详解 命令模式概述 、命令模式结构与实现 、命令模式的应用实例 、命令模式的适用场景 、命令模式的优缺点 阅读详情

原文转载自:http://www.cnblogs.com/zhenyulu/articles/69858.html感谢作者。

一、 命令(Command)模式

命令(Command)模式属于对象的行为模式【GOF95】。命令模式又称为行动(Action)模式或交易(Transaction)模式。命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。

每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。


二、 命令模式的结构

命令模式的类图如下:

 

命令模式涉及到五个角色,它们分别是:

  • 客户(Client)角色:创建了一个具体命令(ConcreteCommand)对象并确定其接收者。
  • 命令(Command)角色:声明了一个给所有具体命令类的抽象接口。这是一个抽象角色。
  • 具体命令(ConcreteCommand)角色:定义一个接受者和行为之间的弱耦合;实现Execute()方法,负责调用接收考的相应操作。Execute()方法通常叫做执方法。
  • 请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。
  • 接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。

 

三、 命令模式的示意性源代码

// Command pattern -- Structural example   
using System; 
 
// "Command" 
abstract class Command 
{ 
  
// Fields 
  protected Receiver receiver; 
 
  
// Constructors 
  public Command( Receiver receiver ) 
  
{ 
    
this.receiver = receiver; 
  }
 
 
  
// Methods 
  abstract public void Execute(); 
}
 
 
// "ConcreteCommand" 
class ConcreteCommand : Command 
{ 
  
// Constructors 
  public ConcreteCommand( Receiver receiver ) : 
    
base ( receiver ) {} 
 
  
// Methods 
  public override void Execute() 
  
{ 
    receiver.Action(); 
  }
 
}
 
 
// "Receiver" 
class Receiver 
{ 
  
// Methods 
  public void Action() 
  
{ 
    Console.WriteLine(
"Called Receiver.Action()"); 
  }
 
}
 
 
// "Invoker" 
class Invoker 
{ 
  
// Fields 
  private Command command; 
 
  
// Methods 
  public void SetCommand( Command command ) 
  
{ 
    
this.command = command; 
  }
 
 
  
public void ExecuteCommand() 
  
{ 
    command.Execute(); 
  }
 
}
 
 
/// <summary> 
///  Client test 
/// </summary>
 
public class Client 
{ 
  
public static void Main( string[] args ) 
  
{ 
    
// Create receiver, command, and invoker 
    Receiver r = new Receiver(); 
    Command c 
= new ConcreteCommand( r ); 
    Invoker i 
= new Invoker(); 
 
    
// Set and execute command 
    i.SetCommand(c); 
    i.ExecuteCommand(); 
  }
 
}

 

四、 玉帝传美猴王上天

命令模式不是新的发明,在美猴王大闹天宫之前就有了。那时玉帝命令太白金星召美猴王上天:"金星径入(水帘洞)当中,面南立定道:'我是西方太白金星,奉玉帝招安圣旨,下界请你上大,拜受仙录。'"玉帝是系统的客户端,太白金星是命令的发出者,猴王是命令的接收者,圣旨就是命令。玉帝的这一道命令就是要求猴王到上界报到。玉帝只管发出命令,而不管命令是怎样传达到美猴王的。太白金星负责将圣旨传到,可是美猴王怎么执行圣旨、何时执行圣旨是美猴王自己的事。果不然,个久美猴王就大闹了天宫。

这个模拟系统的设计如下:


五、 命令模式的实现

首先命令应当"重"一些还是"轻"一些。在不同的情况下,可以做不同的选择。如果把命令设计得"轻",那么它只是提供了一个请求者和接收者之间的耦合而己,命令代表请求者实现请求。

相反,如果把命令设计的"重",那么它就应当实现所有的细节,包括请求所代表的操作,而不再需要接收者了。当一个系统没有接收者时,就可以采用这种做法。

更常见的是处于最"轻"和最"重"的两个极端之间时情况。命令类动态地决定调用哪一个接收者类。

其次是否支持undo和redo。如果一个命令类提供一个方法,比如叫unExecute(),以恢复其操作的效果,那么命令类就可以支持undo和redo。具体命令类需要存储状态信息,包括:

1. 接收者对象实际上实施请求所代表的操作; 
2. 对接收者对象所作的操作所需要的参数; 
3. 接收者类的最初的状态。接收者必须提供适当的方法,使命令类可以通过调用这个方法,以便接收者类恢复原有状态。

如果只需要提供一层的undo和redo,那么系统只需要存储最后被执行的那个命令对象。如果需要支持多层的undo和redo,那么系统就需要存储曾经被执行过的命令的清单,清单能允许的最大的长度便是系统所支持的undo和redo的层数。沿着清单逆着执行清单上的命令的反命令(unExecute())便是undo;沿着清单顺着执行清单上的命令便是redo。


六、 命令模式的实际应用案例

下面的代码使用命令模式演示了一个简单的计算器,并允许执行undo与redo。注意:"operator"在C#中是关键词,所以在前面添加一个"@"将其变为标识符。

// Command pattern -- Real World example   
using System; 
using System.Collections; 
 
// "Command" 
abstract class Command 
{ 
  
// Methods 
  abstract public void Execute(); 
  
abstract public void UnExecute(); 
}
 
 
// "ConcreteCommand" 
class CalculatorCommand : Command 
{ 
  
// Fields 
  char @operator; 
  
int operand; 
  Calculator calculator; 
 
  
// Constructor 
  public CalculatorCommand( Calculator calculator, 
    
char @operator, int operand ) 
  
{ 
    
this.calculator = calculator; 
    
this.@operator = @operator; 
    
this.operand = operand; 
  }
 
 
  
// Properties 
  public char Operator 
  
{ 
    
set{ @operator = value; } 
  }
 
 
  
public int Operand 
  
{ 
    
set{ operand = value; } 
  }
 
 
  
// Methods 
  override public void Execute() 
  
{ 
    calculator.Operation( @
operator, operand ); 
  }
 
  
  
override public void UnExecute() 
  
{ 
    calculator.Operation( Undo( @
operator ), operand ); 
  }
 
 
  
// Private helper function 
  private char Undo( char @operator ) 
  
{ 
    
char undo = ' '; 
    
switch( @operator ) 
    
{ 
      
case '+': undo = '-'; break; 
      
case '-': undo = '+'; break; 
      
case '*': undo = '/'; break; 
      
case '/': undo = '*'; break; 
    }
 
    
return undo; 
  }
 
}
 
 
// "Receiver" 
class Calculator 
{ 
  
// Fields 
  private int total = 0; 
 
  
// Methods 
  public void Operation( char @operator, int operand ) 
  
{ 
    
switch( @operator ) 
    
{ 
      
case '+': total += operand; break; 
      
case '-': total -= operand; break; 
      
case '*': total *= operand; break; 
      
case '/': total /= operand; break; 
    }
 
    Console.WriteLine( 
"Total = {0} (following {1} {2})", 
      total, @
operator, operand ); 
  }
 
}
 
 
// "Invoker" 
class User 
{ 
  
// Fields 
  private Calculator calculator = new Calculator(); 
  
private ArrayList commands = new ArrayList(); 
  
private int current = 0; 
 
  
// Methods 
  public void Redo( int levels ) 
  
{ 
    Console.WriteLine( 
"---- Redo {0} levels ", levels ); 
    
// Perform redo operations 
    for( int i = 0; i < levels; i++ ) 
      
if( current < commands.Count - 1 ) 
        ((Command)commands[ current
++ ]).Execute(); 
  }
 
 
  
public void Undo( int levels ) 
  
{ 
    Console.WriteLine( 
"---- Undo {0} levels ", levels ); 
    
// Perform undo operations 
    for( int i = 0; i < levels; i++ ) 
      
if( current > 0 ) 
        ((Command)commands[ 
--current ]).UnExecute(); 
  }
 
 
  
public void Compute( char @operator, int operand ) 
  
{ 
    
// Create command operation and execute it 
    Command command = new CalculatorCommand( 
      calculator, @
operator, operand ); 
    command.Execute(); 
 
    
// Add command to undo list 
    commands.Add( command ); 
    current
++; 
  }
 
}
 
 
/// <summary> 
/// CommandApp test 
/// </summary>
 
public class Client 
{ 
  
public static void Main( string[] args ) 
  
{ 
    
// Create user and let her compute 
    User user = new User(); 
 
    user.Compute( 
'+', 100 ); 
    user.Compute( 
'-', 50 ); 
    user.Compute( 
'*', 10 ); 
    user.Compute( 
'/', 2 ); 
 
    
// Undo and then redo some commands 
    user.Undo( 4 ); 
    user.Redo( 
3 ); 
  }
 
}

 


七、 在什么情况下应当使用命令模式

在下面的情况下应当考虑使用命令模式:

1、使用命令模式作为"CallBack"在面向对象系统中的替代。"CallBack"讲的便是先将一个函数登记上,然后在以后调用此函数。

2、需要在不同的时间指定请求、将请求排队。一个命令对象和原先的请求发出者可以有不同的生命期。换言之,原先的请求发出者可能已经不在了,而命令对象本身仍然是活动的。这时命令的接收者可以是在本地,也可以在网络的另外一个地址。命令对象可以在串形化之后传送到另外一台机器上去。

3、系统需要支持命令的撤消(undo)。命令对象可以把状态存储起来,等到客户端需要撤销命令所产生的效果时,可以调用undo()方法,把命令所产生的效果撤销掉。命令对象还可以提供redo()方法,以供客户端在需要时,再重新实施命令效果。

4、如果一个系统要将系统中所有的数据更新到日志里,以便在系统崩溃时,可以根据日志里读回所有的数据更新命令,重新调用Execute()方法一条一条执行这些命令,从而恢复系统在崩溃前所做的数据更新。

5、一个系统需要支持交易(Transaction)。一个交易结构封装了一组数据更新命令。使用命令模式来实现交易结构可以使系统增加新的交易类型。


八、 使用命令模式的优点和缺点

命令允许请求的一方和接收请求的一方能够独立演化,从而且有以下的优点:

  • 命令模式使新的命令很容易地被加入到系统里。
  • 允许接收请求的一方决定是否要否决(Veto)请求。
  • 能较容易地设计-个命令队列。
  • 可以容易地实现对请求的Undo和Redo。
  • 在需要的情况下,可以较容易地将命令记入日志。
  • 命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开。
  • 命令类与其他任何别的类一样,可以修改和推广。
  • 你可以把命令对象聚合在一起,合成为合成命令。比如宏命令便是合成命令的例子。合成命令是合成模式的应用。
  • 由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。

命令模式的缺点如下:

  • 使用命令模式会导致某些系统有过多的具体命令类。某些系统可能需要几十个,几百个甚至几千个具体命令类,这会使命令模式在这样的系统里变得不实际。




【QT开发教程】QT设计模式之Command模式(命令模式)的详解及实战应用:灵活的请求封装策略 在软件设计中,如何灵活地管理操作请求是一个常见的问题。Command模式(命令模式)作为行为型设计模式之一,将请求封装为对象,使得可以用不同的请求、队列或者日志来参数化其他对象。本文将介绍Command模式的核心概念,并探讨如何在Qt框架中实现这一模式,特别是在实现撤销/重做功能方面的应用。 阅读详情

相关推荐

设计模式 ( 十三 ) 命令模式Command(对象行为型)

设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活。 例子1:电视机遥控器 :......

黄规速博客:学如逆水行舟,不进则退 2万+

设计模式(行为型模式)之:命令模式(Command Pattern)

命令模式是一个高内聚的模式,其定义为:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请 求排队或者记录请求日志,可以提供命令的撤销和恢复功能。Receiver接受者角色:该角色就是干活的角色,命令传递到这里是应该被执行的Command命令角色:需要执行的所有命令都在这里声明Invoker调用者角色:接收到命令,并执行命令命令模式的意图是将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。

u013921164的博客 4581

C++设计模式_23_Command 命令模式

将一个请求(行为)封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。----《设计模式》GoFCommand模式的根本目的在于将“行为请求者”与“行为实现者”解耦,在面向对象语言中,常见的实现手段是“将行为抽象为对象”实现Command接口的具体命令对象ConcreteCommand有时候根据需要可能会保存一些额外的状态信息。通过使用Composite模式,可以将多个命封装为一个“复合命令”MacroCommand。

分享学习成长历程,Winter is coming! 519

JAVA设计模式--命令模式

目录 一、什么是命令式 二、命令模式的适用性 三、命令模式的结构 四、命令模式的优点 五、认识命令模式 六、总结 一、什么是命令式 命令(Command)模式又叫作动作(Action)模式或事务(Transaction)模式,是一种对象的行为模式。将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。 命令模式的本质:封...

pengjunlee的博客 5万+

IC芯片验证 - 手把手教你搭建UVM验证环境

这是一个UVM的demo项目

howard789的博客 3万+

STM32笔记:高精度脉冲宽度计 双输入捕获+DMA方式

本文介绍如何用STM32F107VC实现高精度的脉冲宽度计(测量周期脉冲的占空比)。 采用定时器的外部输入捕获功能,双输入+DMA方式,追求硬件的极限表现。

st01lsp的专栏 5288

设计模式第19讲——命令模式(Command)

命令模式(Command Pattern)是一种行为型设计模式,又叫动作模式或事务模式。一、什么是命令模式 二、角色组成 三、优缺点 四、应用场景 4.1 生活场景4.2 java场景五、代码实现5.0 UML类图 5.1 抽象命令(Command)——Command5.2接收者(Receiver)——Chef5.3具体命令(Concrete Command)——OrderCommand六、总结

让~学习~成为一种习惯(橡 皮 人の技术博客) 1万+

centos 添加新硬盘,对根目录扩容

本地安装了虚拟机,系统为centos7,使用过程中,渐渐地发现磁盘容量不够用了,于是在虚拟机中新增了一块硬盘。 进入系统内查看: sdb是新增的硬盘,大小为40g。 接下来有两种方式,一种是普通方式直接挂载。https://blog.youkuaiyun.com/qq_39314099/article/details/106200322 这样的话只有在挂载点的目录下操作才能使用到这个新硬盘,不是很理想。 还有一种方式lvm,逻辑卷管理的方式。 LVM简单介绍: 它是 Linux 下对磁盘分区进行管

qq_39314099的博客 1万+

设计模式-命令模式(Command)

命令模式是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。命令模式的主要优点是可以将请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。主要解决在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

miaoyl的博客 2945

别再搞混了!Vue3里xgplayer播放FLV视频与FLV直播流,配置到底差在哪?

本文详细解析了在Vue3项目中使用xgplayer播放FLV视频与FLV直播流的配置差异,帮助开发者避免常见错误。通过对比点播与直播的核心协议差异、插件选择及配置参数,提供实战代码示例和性能优化技巧,确保流畅播放体验。特别针对直播流场景,深入讲解专属配置和问题排查方法。

weixin_28687331的博客 150

三端口DC-DC变换器设计与光伏储能协同控制

三端口DC-DC变换器是面向分布式能源系统的关键功率变换拓扑,通过在光伏输入、储能电池与直流负载三个端口间实现动态能量分配,解决多源异步供电下的电压稳定与功率平衡问题。其核心原理基于双Boost半桥架构与双闭环协同控制,融合MPPT最大功率点跟踪与电池智能充放电管理,在保证30V高精度稳压(±0.5V)的同时,支持光伏主导供电与电池支撑供电的自动模式切换。该技术显著提升光储系统能量利用率与供电连续性,广泛应用于微电网、便携式交直流电源及离网型光储一体机等场景,是构建柔性直流配电与智能能源管理的基础硬件单元。

weixin_36431814的博客 141

设计模式之【命令模式】,方法调用的花式玩法

命令模式(Command Pattern)是对命令的封装,每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式解耦了请求方和接收方,请求方只需请求执行命令,不用关心命令是怎样被接受,怎样被操作以及是否被执行等。命令模式属于行为型模式。原文:将一个请求封装成医德对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。在软件系统中,行为请求者与行为实现者通常是一种紧耦合关系,因为这样的实现简单明了。

秃了也弱了 3751

Labview项目01:标准可配置序列测试框架

摘要:本文介绍了一个基于LabVIEW2020开发的通用测试框架系统。该系统采用模块化设计,包含主界面、调试界面、设置界面和登录界面。主功能包括:1)可配置测试序列,支持延时、预定值输出、随机值输出等操作;2)单步测试功能自主添加;3)界面支持测试序列编辑和权限管理。系统采用队列机制处理事件和测试流程,通过CSV文件存储测试序列,支持参数化配置。用户可自定义测试VI(A_.vi和N_.vi格式),并通过调试界面验证测试序列。最终测试结果在主界面显示,提供整体判断功能。该系统既可作为学习参考,也可用于实际测试

weixin_38637405的博客 1552

【详解】JAVA设计模式命令模式(Command)

命令模式是一种行为设计模式,它将请求封装成对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。命令模式的核心思想是将“请求”作为一个对象,将操作请求者与操作执行者解耦。低耦合:发送者和接收者之间没有直接的依赖关系,这使得系统更加灵活。扩展性:可以很容易地增加新的命令,只需要实现 ​​Command​​ 接口即可。支持撤销操作:可以在 ​​Command​​ 接口中添加 ​​undo()​​ 方法来实现撤销功能。

牛肉胡辣汤 1451

【数据分析】宏基因组alpha和beta多样性分析和差异物种筛选案例

本教程为读者呈现了宏基因组α和β多样性分析的完整案例。通过实际数据和详细步骤,读者可以深入理解这两种分析方法及其在R语言中的实现过程。教程中不仅提供了清晰的代码示例,还对每一步骤进行了详细解释,使读者能够轻松跟随并掌握分析技巧。无论是初学者还是有一定基础的研究者,都能通过本教程快速上手宏基因组多样性分析,为微生物组学研究提供有力支持。

专注生信领域 2202

使用virtuoso gds转lef操作方法

2) 然后,需要创建Pin,这里Pin的概念不同于label/text,是有实际金属的,二者的区别类似于pr中的port和terminal。1) 首先,需要画prBoundary,这个用drawing层的prBoundary画是不行的,不过建议pr阶段就把prBoundary转到gds里,在virtuoso layout中画prBoundary就比较容易。另外,用Create - Create Pin也可以创建pin,更适用于PG pin,操作时先给pg shape打label,最好放正中间。

m0_61544122的博客 1380

设计模式之命令模式详解(Command Pattern)

在软件开发系统中,常常出现“方法的请求者”与“方法的实现者”之间存在紧密的耦合关系。这不利于软件功能的扩展与维护。例如,想对行为进行“撤销、重做、记录”等处理都很不方便,因此“如何将方法的请求者与方法的实现者解耦?”变得很重要,命令模式能很好地解决这个问题。 在现实生活中,这样的例子也很多,例如,电视机遥控器(命令发送者)通过按钮(具体命令)来遥控电视机(命令接收者),还有计算机键盘上的“功能键”...

Superman_peng的博客 400

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

python command详解_python 设计模式之命令(Command)模式

#写在前面也了解了不少设计模式了,他们都有一个通病,那就是喜欢把简单的东西复杂化。比如在不同的类中加个第三者。哈哈哈,简单变复杂是有目的的,那就是降低耦合度,增强可维护性,提高代码复用性,使代码变得健壮。#小白入门--理解什么是命令模式学校中、生活中、社会中总是会存在一定的阶层,虽然我们很多人都不可认可阶层的存在。命令这一词也就在阶层中诞生。家长命令孩子,老师命令学生,领导命令小娄娄。这些都在我们...

weixin_39916379的博客 1682

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

设计模式详解(八):命令模式——Command

Command(命令)模式是一种行为型设计模式,它将请求封装为对象,从而使你可以用不同的请求、队列或日志参数化对象,并支持可撤销操作。这种模式在解耦调用者与接收者之间的交互时非常有用。Command 模式通过将请求封装为对象,实现了请求的解耦和操作的灵活性。在 Android 开发中,Command 模式在任务执行、事件处理以及组件通信中都扮演了重要角色,是理解和设计复杂系统的重要工具。

Android Engineer. 1116

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Java设计模式 —— 【行为型模式】命令模式(Command Pattern) 详解

命令模式是一个行为模式,它是将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。

知唔猪的博客 1459

【设计模式】命令模式(Command)详解:把“请求”封装成对象

本文介绍了命令模式的设计思想及其应用。命令模式通过将请求封装为对象,实现请求发送者与执行者的解耦,支持撤销、记录历史等功能。文章详细解析了命令模式的四个核心角色(命令接口、具体命令、接收者和调用者),并以智能家居遥控器为例展示了具体实现。命令模式的优点包括降低耦合、支持扩展和撤销操作,但也存在增加类数量、结构复杂等缺点。文中还对比了命令模式与策略模式的差异,并列举了JDK中的典型应用(如Runnable接口)。该模式适用于GUI操作、事务处理、队列任务等场景,其本质是为系统提供更灵活的控制能力。

经天纬地,格物致理 875

Java开发中的23种设计模式详解----命令模式(Command)

命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。我们看看关系图:Invoker是调用者(司令员),Receiver是被调用者(士兵),MyCommand是命令,实现了C

sjyttkl的专栏 7473

跟我一起学“仓颉”设计模式-命令模式

本章为大家详细的介绍了仓颉设计模式中命令模式的内容。

Cool_foolisher的博客 466

Java 23 种设计模式:从踩坑到精通 | 命令模式 —— 把操作封装成对象,实现撤销与排队

摘要:当需要将请求的发起者与执行者解耦,或需要支持命令的撤销、排队、日志记录时,直接在调用处写业务逻辑会导致代码高度耦合且难以扩展。命令模式通过将请求封装为独立的对象,让请求的发送者与接收者完全解耦,从而支持参数化命令、命令队列、撤销/重做等高级功能。本文从智能家居遥控器的场景出发,完整讲解命令模式的原理、UML、代码实现、与策略模式的区别,并结合 JDK Runnable、Spring JDBC、消息队列等框架应用,帮你掌握“将行为对象化”的设计精髓。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 1123

设计模式学习笔记--命令模式command pattern(Java版)

一、实质 将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志以及支持可撤销的操作,也称之为动作ACtion模式、事物transaction模式。 二、结构 Command抽象命令类 ConcreteCommand具体命令类 Invoke调用者/请求者 请求的发送者,它通过命令对象来执行请求。一个调用者并不需要在设计时确定其接收者,因此它只与抽

吃果冻不吐果冻皮 1280

设计模式-命令模式(command pattern)

名称:命令模式 说说:这其实和小时候我们传纸条是一样一样的,一张纸条代表一条命令 动机: 适用性: 参与者: 结果:将一个请求封装为一个对象 类图: 说明:一个命令(请求)就是一个实例(命令对象 = 动作的执行者 + 要执行的行为),发送一个命令就是传递一个命令参数。 demo C#: namespace command { class Program {

itol925的专栏 532
上一篇: C++中四种类型转换方式
下一篇: C语言“指针函数”与“函数指针”的区别
疯狂-的-蜗牛
博客等级 码龄16年 427粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值