下面来自head first设计模式的命令模式一章节。

  • 定义

  将"请求"封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

  • 类图

  

  注:

    1、Client:该类主要创建concreteCommand类,并设置其接收者Recevier;

    2、Receiver:该类为接收者类,该类主要是负责接收命令,和执行命令;

    3、Command:该类为 所有命令的抽象类或或接口,该类具备抽象方法execute/undo方法;

    4、Invoker:该类为调用者,该调用者内部持有一个命令对象,调用者在特定时间可以调用内部方法来执行命令对象的execute/undo方;

    5、ConcreteCommand:该类为Command抽象的实现,该类定义了动作与接受者之间的绑定关系

  维基和书上的例子应用结合:

  

/**
* Invoker 调用者
* @author mjs
* @version 1.0.0
* @filename Switch.java
* @time 2017-6-26 下午4:38:31
* @copyright(C) 2017 **********有限公司
*/
package command; public class Switch {
private Command command;
public Switch(){
}
/**
* 持有命令对象初始化
* @param cmd
*/
public void setComman(Command cmd){
this.command = cmd;
}
/**
* 执行命令
*/
public void execute(){
command.execute();
}
}
/**
* 所有命令的抽象接口
* @author mjs
* @version 1.0.0
* @filename Command.java
* @time 2017-6-16 下午4:51:30
* @copyright(C) 2017 **********有限公司
*/
package command; public interface Command {
void execute();
}
/**
* 开灯命令
* @author mjs
* @version 1.0.0
* @filename FlipUpCommand.java
* @time 2017-6-26 下午4:45:45
* @copyright(C) 2017 **********有限公司
*/
package command; public class FlipUpCommand implements Command {
private Light light;
public FlipUpCommand(Light light){
this.light = light;
}
public void execute() {
light.turnOn();
} }
/**
* 关灯命令
* @author mjs
* @version 1.0.0
* @filename FlipDownCommand.java
* @time 2017-6-26 下午5:12:28
* @copyright(C) 2017 **********有限公司
*/
package command; public class FlipDownCommand implements Command {
private Light light;
public FlipDownCommand(Light light){
this.light = light;
}
public void execute() {
light.turnOff();
} }
/**
* Receiver 灯(命令的接收者)
* @author mjs
* @version 1.0.0
* @filename Light.java
* @time 2017-6-26 下午4:47:00
* @copyright(C) 2017 **********有限公司
*/
package command; public class Light {
public Light() {
}
/**
* 开灯
*/
public void turnOn(){
System.out.println("The light is on");
}
/**
* 关灯
*/
public void turnOff(){
System.out.println("The light is off");
} }
/**
* TODO
* @author mjs
* @version 1.0.0
* @filename Client.java
* @time 2017-6-26 下午5:18:47
* @copyright(C) 2017 **********有限公司
*/
package command; public class Client {
public static void main(String[] args) {
//创建concreteCommand类,并设置其接收者Recevier
Command switchUp = new FlipUpCommand(new Light());
//创建调用者Invoker
Switch lightSwitch = new Switch();
lightSwitch.setComman(switchUp);
//执行命令对象动作
lightSwitch.execute();
/**
* 输出:
* The light is on
*/
}
}

  例子比较简单,调用者方可以使用list数组形式存储多个命令,客户端利用控制台输入来执行更多操作。

  上面内容主要来自head first设计模式书中。

  

  

  

  

   

设计模式----行为型模式之命令模式(Command Pattern)的更多相关文章

  1. 设计模式---行为变化模式之命令模式(Command)

    前提:行为变化模式 在组件的构建过程中,组建行为的变化经常导致组件本身剧烈的变化.“行为变化”模式将组件的行为和组件本身进行解耦,从而支持组件的变化,实现两者之间的松耦合. 类中非虚函数和静态函数方法 ...

  2. Java进阶篇设计模式之八 ----- 责任链模式和命令模式

    前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command ...

  3. Java设计模式之八 ----- 责任链模式和命令模式

    前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command ...

  4. C#设计模式学习笔记:(14)命令模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7873322.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第二个模式--命 ...

  5. IOS设计模式之四(备忘录模式,命令模式)

    本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...

  6. 设计模式之第14章-命令模式(Java实现)

    设计模式之第14章-命令模式(Java实现) “小明,滚出去.”“小明,这个问题怎么做?”(可怜的小明无奈躺枪.小明:老师,我和你有什么仇什么怨,我和你有什么仇什么怨啊到底...老师:小明,滚出去.习 ...

  7. IDEA terminal无法从vim的编辑模式转换为命令模式

    Git 修改最后一次的commit历史记录:https://www.baidu.com/link?url=2WF8yFd0iBuVmXLWfutmSoXa12K9D143e_B0A3PTYYHEP9r ...

  8. 设计模式14---设计模式之命令模式(Command)(行为型)

    1.场景模拟 请用软件模拟开机过程 按下启动按钮 然后电源供电 主板开始加电自检 BIOS依次寻找其他设备的BIOS并且让他们初始化自检 开始检测CPU,内存,光盘,硬盘,光驱,串口,并口,软驱即插即 ...

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

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

随机推荐

  1. 基于 KubeSphere CI/CD 将 Spring Boot 项目发布至 Kubernetes

    本示例基于开源的 KubeSphere 容器平台 演示如何通过 GitHub 仓库中的 Jenkinsfile 来创建流水线,流水线共包括 8 个阶段,最终将一个 Hello World 页面部署到 ...

  2. KubeSphere CI/CD+GitLab+Harbor将Spring Boot项目部署至Kubernetes

    上一篇文章分享了如何在 KubeSphere 对公共的代码仓库 GitHub 和镜像仓库 DockerHub 创建流水线,本文将继续使用 KubeSphere,基于 Harbor 和 GitLab 创 ...

  3. 2018 Multi-University Training Contest 3(部分题解)

    Problem F. Grab The Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Ja ...

  4. jQuery - 02. 样式表属性操作/类操作、动画、显示隐藏、滑入、淡入、停止动画、节点操作、添加对象、清空节点

    样式表属性操作.css $("div").css({'width':100,'height':100,'background':'red'}); $("div" ...

  5. 单细胞转录组测序技术(scRNA-seq)及细胞分离技术分类汇总

    单细胞测序流程(http://learn.gencore.bio.nyu.edu) 在过去的十多年里,高通量测序技术被广泛应用于生物和医学的各种领域,极大促进了相关的研究和应用.其中转录组测序(RNA ...

  6. Loadrunner 11 的安装

    安装包可以直接在我的百度网盘下载,这里用的是LR11的版本.电脑系统是win7 链接: https://pan.baidu.com/s/1OApfUemG3oVjLUE79qaikw 提取码: 7n3 ...

  7. Maven学习归纳(四)——传递依赖和依赖的规则

    一.传递依赖 官方文档解释的传送门:http://ifeve.com/maven-dependency-mechanism/ 当存在传递依赖的情况时,主工程对间接依赖的jar可以访问吗? 例如:A.j ...

  8. 快速了解TCP的流量控制与拥塞控制

    有关TCP你不能不知道的三次握手和四次挥手问题,点我跳转 流量控制 1. 滑动窗口 数据的传送过程中很可能出现接收方来不及接收的情况,这时就需要对发送方进行控制以免数据丢失.利用滑动窗口机制可以很方便 ...

  9. 虚拟化(三) -vsphere套件的安装注意及使用

    https://www.cnblogs.com/zhrngM/p/9547958.html [转]虚拟化(三):vsphere套件的安装注意及使用 vsphere套件里面主要的组件有esxi.vcen ...

  10. Net基础篇_学习笔记_第九天_数组

    结构:一次性存储不同类型的变量: 数组:一次性存储相同类型的变量: 数组的语法: 数组类型[ ] 数组名=new 数组类型[数组长度]: int[ ] nums=new int[10]; 数组初值都是 ...