`
zuiyanwangyue
  • 浏览: 167504 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论
阅读更多

命令模式把一个请求和操作封装到一个对象中,目的是把发出命令的责任和执行命令的责任分割开。命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道命令是怎么被接收、执行的,换言之,请求方关注的是结果而不是过程。


Invoker: 执行命令的引擎,可以提供执行命令所需的上下文环境。
Command:命令的抽象定义,其Object execute(Object cmdContext)方法接受执行命令的上下文对象,并返回执行结果。

客户端调用伪代码:
Invoker invoker=new Invoker();//实际情况中可能使用工厂方法(模式)生成
Object result1=invoker.execute(new ConcreteCommandOne());
Object result2=invoker.execute(new ConcreteCommandTwo());

如果配合其它模式一起使用,命令模式还可以适应更多的现实场景,例如需要使用事务时,我们可以定义一个带有事务上下文控制的组合命令:
public class TransactionCommand implements Command<Void>{
  private List<Command> cmdList;
  public TransactionCommand(List<Command> cmdList){ this.cmdList=cmdList; }
  public Void execute(Object cmdContext){
    ...//开始事务
    for(Command cmd:cmdList) cmd.execute(cmdContext);
    ...//所有命令正常执行完毕后提交事务 若捕获到异常后回滚事务
  }
}

客户端调用代码示例:
Command[] cmds=new Command[]{new ConcreteCommandOne(),new ConcreteCommandTwo()};
invoker.execute(new TransactionCommand(Arrays.asList(cmds)));

Spring JdbcTemplate中的命令模式

尽管Spring JdbcTemplate被人们认为是模板方法模式应用的典范,但是从另一个角度理解,其实它也是命令模式应用的最佳实践。以 JdbcTemplate#query(String sql,RowMapper mapper)这个方法为例,我们可以把JdbcTemplate对象看做是命令模式类图中的Invoker,而把RowMapper看做是 Command,在query的过程中JdbcTemplate为RowMapper的执行准备了所有必要的上下文(即ResultSet),客户端(这 里是应用程序中的DAO层)的调用模式也基本符合invoker.execute(Command cmd)。

如果说上面我的结论尚显得牵强,不放看看JdbcTemplate#query(String sql,RowMapper mapper)这个方法的内部实现:
public <T> List<T> query(String sql, RowMapper<T> rowMapper) throws DataAccessException {
  return query(sql, new RowMapperResultSetExtractor<T>(rowMapper));
}
很显然,内部实现调用了JdbcTemplate#query(final String sql, final ResultSetExtractor<T> rse)方法,而这个方法内部又调用了JdbcTemplate#execute(StatementCallback<T> action)方法,这个方法显然更符合命令模式了,StatementCallback是命令接口,JdbcTemplate负责为命令的执行创建必要 的上下文(即java.sql.Statement)。

基于命令模式对传统Service-DAO架构的再思考

如果要问DAO是什么,相信大多数有经验的开发者都会回答是Data Access Object(数据访问对象),但是在某些项目中,它却承担了太多的责任(太多的业务逻辑混杂在里面)。我一直反对在DAO层混杂过多的业务逻辑,DAO 实现简单的CRUD(增删改查)就可以了。业务逻辑该在业务层(Service)实现,但是实际项目中面对的一种现实的尴尬是:如果Service层仅仅 调用DAO层的CRUD方法,往往并不能实现较为复杂的系统需求。于是我们看到了两种极端:一是Service层中嵌入了数据访问代码(JDBC、 Hibernate等等,Service与DAO的职责区分已经被打乱),二是DAO层不断增加新的方法以适应新业务的需要(DAO不再是那个纯洁的 DAO了,各领域对象之间的DAO也不再有统一的接口!!)。

如果基于命令模式对这种传统的架构进行改造,会收到很好的效果,下篇文章中我会详细阐述这种设计思路。

 

原文地址: 命令模式浅析 (来自http://www.infclouds.com 网站)

  • 大小: 16.8 KB
分享到:
评论

相关推荐

    浅析23种软件设计模式

    14. 命令模式:命令模式的主要思想是把一个请求或者操作封装到一个对象中。这种模式的优点是可以使请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,但缺点是增加了系统的复杂度。 15...

    android中shell命令浅析

    ### Android中的Shell命令浅析 #### 一、引言 在Android开发过程中,熟练掌握shell命令对于调试和管理Android应用程序至关重要。本文将详细介绍Android中常用的shell命令及其应用场景,并针对可能出现的问题提供...

    浅析网络命令在计算机网络工程中的应用 (2).pdf

    SOCK命令需要高水平的编程技术,主要用于C/S模式下的网络检测,确保客户端和服务端的通信不会因网络问题而中断。Socket软件就是一种利用网络命令进行编程开发的工具,它通过IP协议分析网络通信,实现网络连接的监听...

    UML与设计模式的浅析

    【UML与设计模式浅析】 UML(Unified Modeling Language),即统一建模语言,是一种用于软件系统分析和设计的标准图形表示法。它为软件开发提供了可视化工具,以描绘系统的需求、架构、交互以及实现等多个方面。UML...

    浅析java常用的设计模式.doc

    14. **命令模式**:命令模式是行为型模式,它将请求封装为一个对象,以便使用不同的请求、队列请求或日志请求。命令模式也支持撤销操作。 15. **解释器模式**:解释器模式是行为型模式,它定义了一个表达式接口,...

    浅析java常用的设计模式(doc-23页).doc

    12. **命令模式**:命令模式将命令封装为一个对象,使得你可以使用不同的命令,支持撤销操作,将请求的发送者与接收者解耦。 13. **解释器模式**:解释器模式定义一个语言的文法表示,并提供一个解释器来解释该语言...

    SFTP 源码浅析1

    连接建立后,客户端进入一个循环等待模式,等待用户输入命令,执行文件传输任务。这一过程由`interactive_loop`函数负责,它持续读取用户在控制台输入的命令,解析并执行这些命令(`parse_dispatch_command`函数)。...

    浅析Wi-Fi路由器Repeater模式的应用.pdf

    5. 为了验证Repeater模式是否成功,可以使用ping命令测试新路由器与原路由器之间的连通性。如果能ping通原路由器的IP地址,说明中继已经成功,网络已扩展至新的区域。 在无线网络环境中,Repeater模式提供了一种...

    浅析Linux常用文件管理命令

    本文将深入浅析一些常用的Linux文件管理命令,这些命令对于任何Linux用户来说都是至关重要的。 首先,`pwd`命令用于显示当前的工作目录,即当前Shell的当前工作目录(CWD)的绝对路径。通过使用`-P`选项,你可以...

    Windows内核调试器原理浅析

    KdpSendWaitContinue是整个调试过程中的关键调度者,它负责根据接收到的调试器命令执行不同的操作,例如读取或写入内存(DbgKdReadVirtualMemoryApi和DbgKdWriteVirtualMemoryApi)、获取或设置寄存器值、处理中断等...

    浅析中职院校CAD制图课程教与学的创新模式.pdf

    例如,在绘制五星红旗的任务中,学生不仅要学会使用绘图命令,还要学会如何结合这些命令来完成具体的图形绘制任务,从而在实践中巩固和拓展其绘图技能。 分层授课法则侧重于对不同层次的学生进行分类教学,以适应...

    浅析U盘的隐藏分区.docx

    标题“浅析U盘的隐藏分区.docx”和描述中提到的主题主要集中在U盘的隐藏分区,这是一种通过特定工具如fbinst或fbinsttool创建的特殊分区,它具有防止病毒、木马攻击以及防止格式化丢失数据的功能。这种隐藏分区在非...

    emmc的读写浅析.docx

    其中,命令线是双向信号,主机和设备驱动程序以两种模式运行,有开漏和推挽二种模式。数据线是双向信号,主机和设备驱动都是在推挽模式下,数据0默认为拉高的状态。 数据传输 eMMC传输数据采用并行方式,是采用...

    浅析php单例模式

    3. 行为型模式关注的是对象之间的通信、控制流和责任分配,例如观察者模式、命令模式和状态模式等。 五、创建型设计模式之单例模式 单例模式是设计模式中的一种,它确保一个类仅有一个实例,并提供一个全局访问点...

    网上资料整理—MFC浅析(pdf)

    在此模式下,很多命令ID都有其缺省的处理方式,这些命令在开发过程中被广泛使用,对于理解MFC应用程序的行为至关重要。 1. **ID_FILE_NEW**: 当用户选择“新建”文件时,会触发`ID_FILE_NEW`命令。在MFC中,此命令...

    数据治理 安卓app漏洞挖掘浅析及案例 - linux.zip

    命令模式是一种设计模式,它允许将请求封装为一个对象,从而使我们能支持可变的命令、参数化、队列或日志记录等功能。在安全上下文中,我们可以利用这一模式来构造安全的API调用,防止命令注入攻击。 SSH(Secure ...

    浅析Nodejs npm常用命令

    本文将详细阐述npm的一些常用命令及其应用场景。 1. `npm install moduleNames`:这个命令用于安装Node.js模块。安装后会在当前项目根目录下创建一个`node_modules`目录,其中包含安装的模块。模块安装有全局和本地...

    基于Web的数据库技术浅析_聂晶_计算机专业论文范文模板、范本.pdf

    【基于Web的数据库技术浅析】 随着互联网技术的迅速发展,Web数据库已经成为处理和存储数据的核心技术。在本文中,作者聂晶探讨了基于Web的数据库技术,特别是B/S(Browser/Server)模式,它是数据库技术与Web技术...

    ZIGBEE路由的浅析

    - **ZCL**:ZCL是Zigbee应用层的一部分,定义了一系列标准命令和事件,使得不同设备间能有效地交换信息。它简化了跨设备的应用程序开发,同时也支持网络中的路由功能。 在Zigbee网络中,每个设备都有一个唯一的64位...

    浅析路由器的口令配置及口令的恢复操作.pdf

    3. 进入ROMMON模式后,使用“dir”命令查看文件系统,找到NVRAM文件。 4. 利用“confreg”命令更改配置寄存器值,通常会设置为忽略启动配置文件,然后重启路由器。 5. 重启后,不加载原来的配置,进入无密码状态,...

Global site tag (gtag.js) - Google Analytics