下面来自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. CF - 1108 E 枚举上界+线段树维护

    题目传送门 枚举每个点作为最大值的那个点.然后既然是作为最大值出现的话,那么这个点就是不需要被减去的,因为如果最小值也在这个区间内的话,2者都减去1,对答案没有影响,如果是最小值不出现在这个区间内的话 ...

  2. CH4301 Can you answer on these queries III 题解

    给定长度为N的数列A,以及M条指令 (N≤500000, M≤100000),每条指令可能是以下两种之一: "2 x y",把 A[x] 改成 y. "1 x y&quo ...

  3. Day005_Linux基础之文件权限

    test.sh  举例: [oldboy@luffy001 ~]$ ls -l test.sh -rw-r--r-- 1 oldboy ops 0 Nov 14 10:42 test.sh  该文件权 ...

  4. mariadb报:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111 "Connection refused")

    我这边移除了mysql.sock文件后,重启服务就成功了. 还有一种情况,就是加入galera后,可能是server.cnf配置信息出了问题导致的,修改后,重新运行galera即可,数据库就可以启动成 ...

  5. 关于git使用的几点理解

    1.git为分布式的版本控制系统,有远程仓库和本地仓库,远程仓库和本地仓库之间建立关联关系后,可将本地仓库的更新push(相当于是内容同步)到远程仓库进行保存,远程仓库的作用相当于一个最终代码备份的地 ...

  6. MultipartFile 获取上传TXT文件字数

    @ResponseBody @RequestMapping(value = "/addImgForDynamic")//(发布动态) public Map addImgForDyn ...

  7. Python3-编码问题-解决为何我的python打印总是出现乱码??

    #python3 编码问题: ############举个例子############################### import sys print(sys.getdefaultencodi ...

  8. 面试官:服务器安装 JDK 还是 JRE?可以只安装 JRE 吗?

    前些日子有知友面试时被问到如题所示的问题,由于他之前没有准备到这些最最基础的知识,没有考虑过这个问题,所以被问到时竟一脸萌币,回答的不是很好.这道题主要考的是对 Java 基础知识的了解,有些同学可能 ...

  9. NGUI_基础入门学习

    目录 1. Control Widgets 控制部件2. Anchors 锚3. Interaction 交互4. Menu 菜单5. Controller Input 控制器的输入6. Lights ...

  10. kafka入门配置

    问题导读: 1.zookeeper在kafka的作用是什么? 2.kafka中几乎不允许对消息进行“随机读写”的原因是什么? 3.kafka集群consumer和producer状态信息是如何保存的? ...