命令模式将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,

并且可以对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

概念描述

把命令的调用者与执行者分开,使双方不必关心对方是如何操作的。
比如有一组文件操作的命令:新建文件、复制文件、删除文件。如果把这三个操作都封装成一个命令类,客户端只需要知道有这三个命令类即可,至于命令类中封装好的逻辑,客户端则无需知道。

在JDK中的体现

允许子类重载部分父类而不需要完全重写。
* java.util.Collections#sort()
* java.io.InputStream#skip()
* java.io.InputStream#read()
* java.util.AbstractList#indexOf()

参与角色

Command类:是一个抽象类,类中对需要执行的命令进行声明,一般来说要对外公布一个execute方法用来执行命令。
ConcreteCommand类:Command类的实现类,对抽象类中声明的方法进行实现。
Client类:最终的客户端调用类。
Invoker类:调用者,负责调用命令。
Receiver类:接收者,负责接收命令并且执行命令。

命令模式实例

当我们调用时,执行的时序首先是调用者类,然后是命令类,最后是接收者类。
一条命令的执行被分成了三步,耦合度要比把所有的操作都封装到一个类中要低的多。

public abstract class Command {

	public abstract void execute();

}

/**
* 具体命令的实现类
* @author bingyue56@163.com
*/
public class ConcreteCommand extends Command{ private Receiver receiver; public ConcreteCommand(Receiver receiver){
this.receiver=receiver;
} /**
* 具体的调用通过命令接收者来实现
*/
@Override
public void execute() {
this.receiver.action();
}
}
public class Receiver {

	/**
* 真正执行命令操作的代码
*/
public void action(){
System.out.println("命令接收者-执行具体业务逻辑");
}
}

  

/**
* 调用者 负责调用命令
*/
public class Invoker { private Command command; public void setCommand(Command command) {
this.command = command;
}
public void action(){
this.command.execute();
}
}

  

/**
* 客户端调用
* @author bingyue56@163.com
*/
public class Client { public static void main(String[] args){
//得到业务逻辑执行者
Receiver receiver=new Receiver();
//命令类-注入具体业务逻辑接收者
Command command =new ConcreteCommand(receiver);
/**
* 两种调用方式
* 1.命令类直接调用执行
*/
command.execute();
/**
* 2.通过invoker的方式注入命令
*/
Invoker invoker=new Invoker();
invoker.setCommand(command);
//调用内部command的执行
invoker.action();
} }

适用场景

1.使用命令模式作为"CallBack"在面向对象系统中的替代。CallBack讲的便是先将一个函数登记上,然后在以后调用此函数。

2.需要在不同的时间指定请求、将请求排队。一个命令对象和原先的请求发出者可以有不同的生命期。换言之,原先的请求发出者可能已经不在了,而命令对象本身仍然是活动的。这时命令的接收者可以是在本地,也可以在网络的另外一个地址。命令对象可以在序列化之后传送到另外一台机器上去。

3.系统需要支持命令的撤消(undo)。命令对象可以把状态存储起来,等到客户端需要撤销命令所产生的效果时,可以调用undo()方法,把命令所产生的效果撤销掉。命令对象还可以提供redo()方法,以供客户端在需要时,再重新实施命令效果。

4.如果一个系统要将系统中所有的数据更新到日志里,以便在系统崩溃时,可以根据日志里读回所有的数据更新命令,重新调用Execute()方法一条一条执行这些命令,从而恢复系统在崩溃前所做的数据更新。

参考整理自:

Java之命令模式(Command Pattern)

23种设计模式(10):命令模式  

行为型模式之Command模式的更多相关文章

  1. Java设计模式(22)命令模式(Command模式)

    Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体 ...

  2. 常用模式之Command模式入门

    package com.zhao.cmd.a; /** * 客户端调用 * 烧烤摊 * * @author LuZhao * */ public class App { public static v ...

  3. NET设计模式 第二部分 行为型模式(16):命令模式(Command Pattern)

    命令模式(Command Pattern) ——.NET设计模式系列之十七 TerryLee,2006年7月 概述 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”.但在某些场合,比 ...

  4. .NET设计模式(17):命令模式(Command Pattern)(转)

    概述 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将“行为 ...

  5. 开发设计模式(一)Command模式

    Command定义 将来自客户端的请求传入一个对象,无需了解这个请求激活的 动作或有关接受这个请求的处理细节. 这是一种两台机器之间通讯联系性质的模式,类似传统过程语 言的 CallBack功能. 优 ...

  6. 行为型模式(十) 备忘录模式(Memento)

    一.动机(Motivate) 我们看上图,一个对象肯定会有很多状态,这些状态肯定会相互转变而促进对象的发展,如果要想在某一时刻把当前对象回复到以前某一时刻的状态,这个情况用"备忘录模式&qu ...

  7. Java设计模式(18)策略模式(Strategy模式)

    Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线, ...

  8. Java设计模式(19)状态模式(State模式)

    State的定义:不同的状态,不同的行为:或者说,每个状态有着相应的行为. 何时使用状态模式 State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If else ...

  9. Java设计模式(17)解释器模式(Interpreter模式)

    Interpreter定义:定义语言的文法,并且建立一个解释器来解释该语言中的句子. Interpreter似乎使用面不是很广,它描述了一个语言解释器是如何构成的,在实际应用中,我们可能很少去构造一个 ...

随机推荐

  1. Python面向对象-day07

    写在前面 上课第七天,打卡: 时间的高效利用: 前言: 今天egon老师补充了下 is 和 == 的区别,整理如下:Python中变量的属性以及判断方法 一.面向过程和面向对象 - 1.面向过程 核心 ...

  2. Java之Jacob调用COM接口DLL-----------------------------------dm。dll

    用Java控制windows了,嗯,低层次按键模拟,可控制游戏,内存也不在话下. 一.环境介绍 1.myeclipse8.5 2.著名按键插件dm.dll  32bit.此插件实现COM接口,百度百科 ...

  3. Tessaract 源码分析(转)

    源码分析 Page Layout 分析步骤 二值化算法: OTSU调用栈:main[api/tesseractmain.cpp] -> TessBaseAPI::ProcessPages[api ...

  4. 关于Laravel 无法下载的问题

    今天在git bush用composer安装laravel5.5卡住了,无法下载 解决办法:更换到国内源,就可以下载了 运行命令: composer config -g repo.packagist ...

  5. mysql 原理 ~ binlog

    一 简介:我们会持续对binlog进行分析,但是不深入代码二 版本 5.6    格式    GTID和传统格式    传统格式     一 binlog针对具体事务注意点-1         1 u ...

  6. Kali2.0更新

    下载链接:猛戳这里 更新以后速度与界面友好性提高了! 界面仿造了ubuntu和fedora,应用也有很多小图标!这个对个人来说比较赞 安装以后的几件事 1.安装vmtools,方法跟1.0一样! ta ...

  7. Your Database is downloaded and backed up on....(腾讯云的mysql被攻击)

    今天发现自己的服务器被黑客攻击,自己的mysql服务器的库被删掉,并且新创了一个warning库,只有一个readme表.不知道原因,也许是自己再github上的项目暴漏了自己的密码,还要0.6比特币 ...

  8. <crtdbg.h> 的作用

    1.在调试状态下让win程在输出窗口中显示调试信息,可以用_RPTn 宏n为显示参数比如_RPT0(_CRT_WARN,"text"); _RPT1(_CRT_WARN," ...

  9. Mysql被攻击

    日志: show global variables like '%general%'; set global general_log=on; 默认Path:/var/run/mysqld/mysqld ...

  10. GCC 符号表小结【转】

    转自:https://blog.csdn.net/swedenfeng/article/details/53417085 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...