命令模式(Command)的定义

将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录日志,以及支持可撤销的操作,将”发出请求的对象”和”接收与执行这些请求的对象”分隔开来。

命令模式(Command)的适用性

1.抽象出待执行的动作以参数化某对象。

2.在不同的时刻指定、排列和执行请求。

3.支持取消操作。

4.支持修改日志,这样当系统崩溃时,这样修改可以被重做一遍。

5.用构建在原语操作上的高层操作构造一个系统。

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

命令模式(Command)的参与者

  1.Command

声明执行操作的接口。

2.ConcreteCommand

将一个接收者对象绑定于一个动作。

调用接收者相应的操作,以实现Execute。

3.Client

创建一个具体命令对象并设定它的接收者。

4.Invoker

要求该命令执行这个请求。

5.Receiver

知道如何实现与执行一个请求相关的操作。任何类都可能作为一个接收者。

命令模式(Command)的UML类图

            

具体的代码实现:

第一步:定义Command,声明执行操作的接口

//命令接口
public interface Command { //执行操作
public void excute();
//撤销操作
public void unDo();
}

第二步:定义ConcreteCommand,将一个接收者对象绑定于一个动作。

public class ConcreteCommand implements Command {

    // 持有一个接受者Receiver的引用,绑定一个特定的操作
Receiver receiver; public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
} @Override
public void excute() {
// 接受者绑定执行动作
receiver.action();
} @Override
public void unDo() {
// 接受者绑定的撤销动作
receiver.unAction();
}
}

第三步:定义Receiver,知道如何实现与执行一个请求相关的操作

public class Receiver {

    public void action() {
System.out.println("执行一个命令");
} public void unAction() {
System.out.println("撤销一个命令");
}
}

第四步:定义Invoker,要求该命令执行这个请求。

public class Invoker {

    // 调用者持有一个命令对象
Command command; public Command getCommand() {
return command;
} public void setCommand(Command command) {
this.command = command;
} // 执行命令
public void excuteCommmand() {
command.excute();
} // 撤销命令
public void undoCommand() {
command.unDo();
}
}

第五步:定义Clien,我们来测试一下我们的命令模式

public class Client {

    /**
* @param args
*/
public static void main(String[] args) {
// 创建命令的接受者
Receiver receiver = new Receiver();
// 创建命令对象,并设定它的接受者
Command command = new ConcreteCommand(receiver);
// 创建命令执行者,并将相应的命令作为参数传递给Invoker
Invoker invoker = new Invoker();
invoker.setCommand(command);
// Client端测试一下
invoker.excuteCommmand();
invoker.undoCommand();
} }

运行结果:

执行一个命令
撤销一个命令

总结:

1、在被解耦的两者之间是通过命令对象进行沟通的,命令对象封装了接收者和一个或一组动作;
2、调用者通过调用命令对象的execute()发出请求,这会使得接收者的动作被调用;
3、调用者可以接受命令当作参数,甚至在运行时动态的进行;
4、命令可以支持撤销,做法是实现一个undo()方法来回到execute()被执行前的状态;
5、命令模式将发出请求的对象和执行请求的对象进行解耦;

Java设计模式系列之命令模式的更多相关文章

  1. Java设计模式系列-抽象工厂模式

    原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755412.html 一.概述 抽象工厂模式是对工厂方法模式的再升级,但是二者面对的场景稍显差别. ...

  2. Java设计模式系列-工厂方法模式

    原创文章,转载请标注出处:<Java设计模式系列-工厂方法模式> 一.概述 工厂,就是生产产品的地方. 在Java设计模式中使用工厂的概念,那就是生成对象的地方了. 本来直接就能创建的对象 ...

  3. Java设计模式系列-装饰器模式

    原创文章,转载请标注出处:<Java设计模式系列-装饰器模式> 一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是 ...

  4. Java设计模式学习记录-命令模式

    前言 这次要介绍的是命令模式,这也是一种行为型模式.最近反正没有面试机会我就写博客呗,该投的简历都投了.然后就继续看书,其实看书也会给自己带来成就感,原来以前不明白的东西,书上已经给彻底的介绍清楚了, ...

  5. 重学 Java 设计模式:实战命令模式「模拟高档餐厅八大菜系,小二点单厨师烹饪场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 持之以恒的重要性 初学编程往往都很懵,几乎在学习的过程中会遇到 ...

  6. java设计模式-----23、命令模式

    概念: Command模式也叫命令模式 ,是行为设计模式的一种.Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数. 命令模式(Command Pattern)是一种 ...

  7. c#设计模式系列:命令模式(Command Pattern)

    引言 命令模式,我感觉"命令"就是任务,执行了命令就完成了一个任务.或者说,命令是任务,我们再从这个名字上并不知道命令的发出者和接受者分别是谁,为什么呢?因为我们并不关心他们是谁, ...

  8. 《JAVA设计模式》之命令模式(Command)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述命令(Command)模式的: 命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式. ...

  9. C#设计模式系列:命令模式(Command)

    1.命令模式简介 1.1>.定义 命令模式的目的是解除命令发出者和接收者之间的紧密耦合关系,使二者相对独立,有利于程序的并行开发和代码的维护.命令模式的核心思想是将请求封装为一个对象,将其作为命 ...

随机推荐

  1. 如何使用UIAutomation进行iOS 自动化测试(Part I)

    转自:http://www.cnblogs.com/vowei/archive/2012/08/10/2631949.html 写在前面 研究iOS的自动化测试也有些日子了,刚开始的时候,一直苦于找不 ...

  2. UVa 10883 (组合数 对数) Supermean

    在纸上演算一下就能看出答案是:sum{ C(n-1, i) * a[i] / 2^(n-1) | 0 ≤ i ≤ n-1 } 组合数可以通过递推计算:C(n, k) = C(n, k-1) * (n- ...

  3. 8款PHP调试工具

    Web 开发并不是一项轻松的任务,有超级多服务端脚本语言提供给开发者,但是当前 PHP 因为具有额外的一些强大的功能而越来越流行.PHP 是最强大的服务端脚本语言之一,同时也是 web 开发者和设计者 ...

  4. Html5大文件断点续传

    大文件分块   一般常用的web服务器都有对向服务器端提交数据有大小限制.超过一定大小文件服务器端将返回拒绝信息.当然,web服务器都提供了配置文件可能修改限制的大小.针对iis实现大文件的上传网上也 ...

  5. 完全二叉树的高度为什么是对lgN向下取整

    完全二叉树的高度为什么是对lgN向下取整呢? 说明一下这里的高度:只有根节点的树高度是0. 设一棵完全二叉树节点个数为N,高度为h.所以总节点个数N满足以下不等式: 1 + 21 + 22 +……+ ...

  6. 02day2

    油滴扩展 [问题描述] 在一个长方形框子里,最多有 N(0≤N≤6)个相异的点.在其中任何-个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界.必须等一个油滴扩展完毕才能 ...

  7. BUFFER CACHE之调整buffer cache的大小

    Buffer Cache存放真正数据的缓冲区,shared Pool里面存放的是sql指令(LC中一次编译,多次运行,加快处理性能,cache hit ratio要高),而buffer cache里面 ...

  8. 【Struts】服务器文件的上传和下载

    Java中获得文件的文件后缀 import java.io.*; public class FileTest{ public static void main(String args[]){ File ...

  9. 【转】Linux 之 /etc/profile、~/.bash_profile 等几个文件的执行过程

    原文网址:http://blog.csdn.net/ithomer/article/details/6322892 在登录Linux时要执行文件的过程如下:在刚登录Linux时,首先启动 /etc/p ...

  10. 嵌入式 hi3518c下ramdisk文件系统与文件系统烧写以及uboot中change-the-env

    NULL RAM : mkdir ramdisk_test  临时挂在点 dd if=/dev/zero of=123 bs=1k count=10000 建立空硬盘 losetup /dev/loo ...