意图:

  将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录日志,以及支持可撤销的操作

动机:

  将”发出请求的对象”和”接收与执行这些请求的对象”分隔开来。

效果:
  1)、command模式将调用操作的对象和实现该操作的对象解耦
  2)、可以将多个命令装配成一个复合命令,复合命令是Composite模式的一个实例
  3)、增加新的command很容易,无需改变已有的类

适用性:
  1)、抽象出待执行的动作以参数化某对象
  2)、在不同的时刻指定、排列和执行请求。如请求队列
  3)、支持取消操作
  4)、支持修改日志
  5)、用构建在原语操作上的高层操作构造一个系统。支持事物

参与者:
 1)、Command
  声明执行操作的接口
 2)、ConcreteCommand
  将一个接收者对象绑定于一个动作
  调用接收者相应的操作,以实现execute
 3)、Client
  创建一个具体命令对象并设定它的接收者
 4)、Invoker
  要求该命令执行这个请求
 5)、Receiver
  知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者

结构图:

协作:
  1)、client创建一个ConcreteCommand对象并指定它的Receiver对象
  2)、某Invoker对象存储该ConcreteCommand对象
  3)、该Invoker通过调用Command对象的execute操作来提交一个请求。若该命令是可撤销的,ConcreteCommand在执行execute操作前存储当前状态以用于取消该命令
  4)、ConcreteCommand对象调用它的Receiver的操作以执行该请求

命令对象将动作和接受者包进对象中,这个对象只暴露出一个execute()方法,当此方法被调用的时候,接收者就会进行这些动作。从外面来看,其他对象不知道究竟哪个接收者进行了哪些动作,只知道如果调用execute()方法,请求的目的就能达到。

实现源码:

package com.blankjor.command;

/**
* @desc 命令接口
* @author Blankjor
* @date 2017年5月20日 上午9:49:53
*/
public interface Command {
/**
* 执行命令
*/
void excute(); /**
* 撤销命令
*/
void undo(); } package com.blankjor.command; /**
* @desc 真正命令执行者,接收者
* @author Blankjor
* @date 2017年5月20日 上午9:52:13
*/
public class Receiver {
public void action() {
System.out.println("正在执行命令...");
} public void unAction() {
System.out.println("正在撤销命令...");
} } package com.blankjor.command; /**
* @desc 创建命令(可实现多条命令以及多个命令执行人)
* @author Blankjor
* @date 2017年5月20日 上午9:54:27
*/
public class CreateCommand implements Command {
private Receiver receiver; /**
* 初始化命令接收人
*
* @param receiver
*/
public CreateCommand(Receiver receiver) {
this.receiver = receiver;
} @Override
public void excute() {
receiver.action();
} @Override
public void undo() {
receiver.unAction();
} } package com.blankjor.command; /**
* @desc 命令调用者
* @author Blankjor
* @date 2017年5月20日 上午9:59:05
*/
public class Invoker {
private Command command; /**
* 命令调用者持有该命令
*
* @param command
*/
public Invoker(Command command) {
this.command = command;
} /**
* 执行命令
*/
public void runCommand() {
command.excute();
} /**
* 撤销命令
*/
public void unRunCommand() {
command.undo();
}
} package com.blankjor.command; /**
* @desc 命令模式测试
* @author Blankjor
* @date 2017年5月20日 上午10:02:33
*/
public class TestMain {
public static void main(String[] args) {
// new 一个命令执行人
Receiver receiver = new Receiver();
// new 一条命令
Command command = new CreateCommand(receiver);
// 开始调用命令
Invoker invoker = new Invoker(command); invoker.runCommand();
invoker.unRunCommand();
} }

执行结果:

常见应用:
 1、工作队列,线程池,日程安排
 2、日志请求(系统恢复)
要点:
 1、命令模式将发出请求的对象和执行请求的对象解耦
 2、在被解耦的两者之间是通过命令对象进行沟通的。命令对象封装了接收者和一个或一组动作
 3、调用者通过调用命令对象的execute()发出请求,这会使得接收者的动作被调用
 4、调用者可以接受命令当作参数,甚至在运行时动态的进行
 5、命令可以支持撤销,做法是实现一个undo()方法来回到execute()被执行前的状态
 6、宏命令是命令的一种简单的延伸,允许调用多个命令。宏方法也可以支持撤销
 7、实际操作时,很常见使用"聪明"命令对象,也就是直接实现了请求,而不是将工作委托给接受者(弊端?)
 8、命令也可以用来实现日志和事物系统

参考:http://www.cnblogs.com/ikuman/archive/2013/08/06/3233092.html

Java设计模式の命令模式的更多相关文章

  1. 【设计模式】Java设计模式 - 命令模式

    Java设计模式 - 命令模式 生命不息,写作不止 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 分享学习心得,欢迎指正,大家一起学习成长! 目录 Ja ...

  2. JAVA 设计模式 命令模式

    用途 命令模式 (Command) 将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化:对请求排队或请求日志,以及支持可撤销的操作. 命令模式是一种行为型模式. 结构

  3. Java设计模式-命令模式(Command)

    命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行.这个过程好在,三者相互解耦,任何一方都不用去依赖其 ...

  4. JAVA设计模式---命令模式

    1.定义: 将“请求”封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象,命令模式也支持可撤销的操作.命令可以用来实现日志和事务系统. 2.实例: 1)需求:设计一个家电遥控器的API,遥控 ...

  5. Java设计模式—命令模式

    命令模式是一个高内聚的模式. 定义如下:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 通用类图如下: 角色说明: ● Re ...

  6. linkin大话设计模式--命令模式

    linkin大话设计模式--命令模式 首先考虑一种应用情况,某个方法需要完成某一个功能,这个功能的大部分功能已经确定了,但是有可能少量的步骤没法确定,必须等到执行这个方法才可以确定. 也就是说,我们写 ...

  7. Java设计模式——组合模式

    JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...

  8. java设计模式--单列模式

    java设计模式--单列模式 单列模式定义:确保一个类只有一个实例,并提供一个全局访问点. 下面是几种实现单列模式的Demo,每个Demo都有自己的优缺点: Demo1: /** * 单列模式需要满足 ...

  9. 3.java设计模式-建造者模式

    Java设计模式-建造者模式 在<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal repr ...

随机推荐

  1. Cross origin requests are only supported for protocol schemes: http, data, chrome,chrome-extension的问题

    Cross origin requests are only supported for protocol schemes: http, data, chrome,chrome-extension的问 ...

  2. centos下安装升级python到python3.5

    本文摘抄自:https://www.cnblogs.com/edward2013/p/5289056.html  请支持原版 CentOS7安装Python3.5   2. 安装Python的依赖包 ...

  3. 王者荣耀交流协会-Alpha发布用户使用报告

    用户数量:10人 姓名如下(包括化名):张小斌.王瑞瑞.蛋蛋.小美.晨曦.小丽.张利刚.小闫.小谢.小崔 寻找的用户多为王者荣耀交流协会成员的同学,对管理时间有着强烈的需求,也对PSP Daily软件 ...

  4. KMP的原理和代码实现(详细注释|参考多个博客总结|可作为模板)

    KMP算法解决的问题是字符匹配,是由Knuth–Morris–Pratt共同开发出来的,这个算法把字符匹配的时间复杂度缩小到O(m+n),而空间复杂度也只有O(m),n是target的长度,m是pat ...

  5. mvc4 找到多个与名为“xx”的控制器匹配的类型

    asp.net mvc4 添加分区出现错误 找到多个与名为“home”的控制器匹配的类型 会出现如下错误”找到多个与名为“home”的控制器匹配的类型“ 在RouteConfig文件中添加命名空间可解 ...

  6. 使用ResourceBundle 类读取 src 下的 xxx.properties 文件

    之前要读取 src 下的 .properties 文件都是使用的类加载器,加载类路径下的资源文件当做一个流来处理,load 到一个 Properties 对象上. jdbc.properties 代码 ...

  7. MySQL---InnoDB引擎隔离级别详解

    原帖:http://www.cnblogs.com/snsdzjlz320/p/5761387.html SQL标准定义了4种隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不 ...

  8. delphi 事务处理SQL语句

    方法一(利用adoconnection.exe(sqlstate)): adoconnection1.begintrans;//开始事务try adoconnection1.execute(sqlst ...

  9. mysql(六)索引的数据结构

    先做抽象定义如下: 定义一条数据记录为一个二元组[key, data],key为记录的键值,对于不同的数据记录,key是互不相同的:data为数据记录除key外的数据. B-tree的特点: d为大于 ...

  10. 第190天:js---String常用属性和方法(最全)

    String常用属性和方法 一.string对象构造函数 /*string对象构造函数*/ console.log('字符串即对象');//字符串即对象 //传统方式 - 背后会自动将其转换成对象 / ...