命令模式把一个请求和操作封装到一个对象中,目的是把发出命令的责任和执行命令的责任分割开。命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道命令是怎么被接收、执行的,换言之,请求方关注的是结果而不是过程。
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
分享到:
相关推荐
2022/3/2 下午8:30浅析JDWP远程命令执漏洞 [ Mi1k7ea ]https://www.mi1k7ea.com/2021/08/06/浅析JDW
14、命令模式:命令模式把一个请求或者操作封装到一个对象中。命令模式把发出 命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和 发送的一方独立开来,使得请求的一方不必知道接收...
emmc的读写浅析,cmd:命令线是双向信号。主机和设备驱动程序以两种模式运行,有开漏和推挽二种模式。 DAT0-7:数据线是双向信号,主机和设备驱动都是在推挽模式下(data0默认为拉高的状态)
简单解释一下ipcs命令和ipcrm命令。 取得ipc信息: ipcs [-m|-q|-s] -m 输出有关共享内存(shared memory)的信息 -q 输出有关信息队列(message queue)的信息 -s 输出有关“遮断器”(semaphore)的信息 %ipcs -m ...
npm是一个node包管理和分发工具,已经成为了非官方的发布node模块(包)的标准。有了npm,可以很快的找到特定服务要使用的包,进行下载、安装以及管理已经安装的包。...全局安装命令为npminstall−g
数据治理 安卓app漏洞挖掘浅析及案例 - linux 移动安全 安全集成 安全实践 攻防实训 工控安全
ASP.NET 2.0 异步页面原理浅析 [1] [原] 自定义通用System.Web.UI.IHierarchicalDataSource简单实现 在 ASP.NET 2.0 中创建 Web 应用程序主题 ASP.NET 2.0 中的数据访问 ASP.NET 2.0:弃用 DataGrid 吧,有新的网格...
博主是个web安全爱好者,最近搭建靶机测试时遇到了这个问题,最后解决了,VM中的kali可以和Virtual Box(以下简称VB)中的CentOS系统ping通,并且可以被 netdiscover 命令发现 博主使用的VB是4.3.12版本的,这个版本...
Linux Cpp 后台开发进阶学习 本项目用于Linux Cpp后台开发秋招学习,内容主要涵盖以下几个部分:Cpp...Linux进程创建之浅析fork() Linux环境编程 Linux 系统编程(一)Linux开发环境+Visual Studio Code配置
服务器配置与管理论文 浅析FTP服务器配置与管理中的排错方法 服务器配置与管理论文内容 1FTP工作原理 FTP服务采用客户机/服务器模式,FTP客户机和服务器使用TCP建立连接。FTP服务器使用两个并行的TCP连接来传送文件...
2715 网吧维护\资料\WINDOWS XP 开始→运行→命令 集锦.TXT 25742 网吧维护\资料\WINDOWS XP 的 TCP IP 和 NBT 配置参数祥解.TXT 20198 网吧维护\资料\WINDOWS XP中的命令行界面.TXT 3468 网吧维护\资料\WINDOWS XP...