意图:

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

动机:

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

效果:
  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. 【转载】windows安装python2.7后的注册表问题

    原文出自:https://www.cnblogs.com/tlz888/p/6879227.html [提要]win平台上,python2.7官网的安装包在安装后不会添加环境变量且不会把安装信息写入注 ...

  2. Beta发布——视频博客

    1.视频链接 视频上传至优酷自频道,地址链接:http://v.youku.com/v_show/id_XMzkzNzAxNDk2OA==.html?spm=a2hzp.8244740.0.0 2.视 ...

  3. python 二维矩阵及转byte知识点

    1.注意python中的数组和list形式混合: 数组在numpy里面: 2.二维数组这样定义可以修改固定位置的值: rawDataArray_temp = [([0]*nIRImageWidth)f ...

  4. UVALive 6912 Prime Switch 暴力枚举+贪心

    题目链接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show ...

  5. 运维学习笔记(七)之T02-01计算机网络 、 数制 、 网络通信参考模型

    计算机网络 计算机网络概述 什么是计算机网络 硬件方面:通过线缆将网络设备和计算机连接起来 软件方面:操作系统.应用软件.应用程序通过通信线路互连 实现资源共享.信息传递 功能 数据通信/资源共享/增 ...

  6. (转)微软借力.NET开源跨平台支持,布局物联网平台开发

    今天科技类最大的新闻,莫过于微软宣布.NET开发框架开源计划..NET 开源,集成 Clang 和 LLVM 并且自带 Android 模拟器,这意味着 Visual Studio 这个当下最好没有之 ...

  7. jquery mobiscroll 滑动、滚动

    mobiscroll : 滑动选择 2.13.2版本免费,官网(mobiscroll.com)收费 先从官方下载2.13.2体验版下来,查看例子结合官方API学习( http://docs.mobis ...

  8. libmnl

    https://www.netfilter.org/projects/libmnl/doxygen/modules.html 1,tar xvf libmnl-1.0.4.tar.gz 2,cd li ...

  9. mybatis(一)MyBatis Generator

    在gradle中使用MyBatis Generator时,build.gradle配置如下: dependencies { mybatisGenerator group: 'org.mybatis.g ...

  10. android面试(3)---基本问题

    1.值类型,引用类型? 基本数据类型都是值类型:byte,short,int,long,float,double,char,boolean 其他类型都是引用类型. 引用类型在传入方法是,方法内部对引用 ...