设计模式之命令(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万+

保姆级教程:用YOLOv5+ROS2 Humble搞定奥比中光Dabai DCW深度相机的3D物体定位

本教程详细介绍了如何使用YOLOv5模型和ROS2 Humble系统,结合奥比中光Dabai DCW深度相机实现3D物体定位。从环境配置、模型部署到深度数据融合,提供完整的实战指南,帮助开发者快速掌握三维坐标提取技术,适用于机器人开发和计算机视觉应用。

weixin_26765363的博客 270

方差迭代计算公式

方差迭代计算过程推导术语约定递推公式过程推导 术语约定 (1)En=1n∑i=1nxi E_n =\frac{1}{n} \sum_{i=1}^{n}x_i \tag{1} En​=n1​i=1∑n​xi​(1) (2)F(n)=∑i=1n(x2−En) F(n) = \sum_{i=1}^{n}{(x^2-E_n)} \tag{2} F(n)=i=1∑n​(x2−En​)(2) (3)V(n)...

weixin_44479136的博客 7921

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

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

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

一图文带您认识磁编码器

磁编码器是以磁电原理技术生产的编码器。 磁编码器工作原理: 当电流通过一个位于磁场中的导体的时候,磁场会对导体中的电子产生一个垂直于电子运动方向上的的作用力,从而在垂直于导体与磁感线的方向上产生电势差。 如果让施加在这个导体上的磁场以电流流经路径为轴线,按照上图箭头所示的方向旋转,那么这个霍尔电势差就会因为磁场与导体之间角度的改变而发生变化,而这个电势差的变化趋势,与之前一文中次级线圈旋转时的输出电压一样,是一条正弦曲线。因此,基于这个通电导体两侧的电压,就可以反推计算出磁场旋转的角度了。 .

encoder_yang的博客 2万+

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

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

miaoyl的博客 2945

保姆级教程:用PyTorch从零实现SDE扩散模型(附完整代码与MNIST实战)

本文提供了一份详细的PyTorch教程,指导读者从零开始实现SDE扩散模型,并附有完整的代码示例和MNIST数据集实战。通过解释随机微分方程(SDE)的核心概念、模型架构设计、训练流程实现以及采样生成过程,帮助开发者掌握扩散模型的构建与应用。

weixin_28677005的博客 265

GEO优化实战:用AnswerBit量化AI搜索可见度与品牌监控体系

生成式引擎优化(GEO)正取代传统SEO,成为品牌在AI搜索生态中获取可见度的关键。当用户习惯从“翻列表”转向“直接问AI”,品牌能否被生成式引擎识别、引用并正向推荐,直接决定了其在用户决策链条中的存在感。AI搜索可见度因此从模糊概念演变为可度量的运营指标,涵盖提及率、引文率、情感分与回源质量等维度。腾讯AnswerBit作为答案侧分析工具,帮助运营者拆解AI回复中的品牌语境与引用来源,让优化动作有据可循。从内容结构化改造、品牌实体建设到第三方权威背书,GEO要求团队建立“度量-优化-再度量”的闭环。文章结

weixin_31100517的博客 152

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

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

秃了也弱了 3751

一套C#接口通吃安川/发那科/库卡:工业机器人统一控制框架设计与产线踩坑实录

我们把机器人的通用能力抽象为接口,涵盖连接、运动、IO、寄存器、状态、报警六大类能力,所有品牌适配器都必须实现这个接口。/// 工业机器人统一控制接口// 基础连接// 运动控制// IO与寄存器// 状态与报警// 事件工业机器人统一控制框架的本质,不是把所有品牌的功能都做平,而是找到通用能力的最大公约数,通过分层抽象把品牌差异隔离在底层。上层业务只关注工艺和流程,不需要关心机器人是什么品牌、用什么SDK、通信协议是什么。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 404

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

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

牛肉胡辣汤 1451

UniRx之基本语法格式

想要更好的去学习UniRx,我们最好是先理解UniRx 的语法格式。就像我们去学习英语或者汉语一样,理解了基本的语法规则后,再学其他的就信手拈来了。

TxNet 924

微信小程序|基于小程序+云开发制作一个菜谱小程序

今天吃什么?这是一个让强迫症左右为难的问题,跟随此文基于小程序+云开发制作一个菜谱小程序,根据现有食材一键生成菜谱,省心又省力。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

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

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

Superman_peng的博客 400

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

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

weixin_39916379的博客 1682

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

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

Android Engineer. 1116

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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、付费专栏及课程。

余额充值