下面来自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. Go组件学习——手写连接池并没有那么简单

    1.背景 前段时间在看gorm,发现gorm是复用database/sql的连接池. 于是翻了下database/sql的数据库连接池的代码实现,看完代码,好像也不是很复杂,但是总觉得理解不够深刻,于 ...

  2. window对象,BOM,window事件,延时器,DOM

    01.定时器补充 function fn(){    console.log(1);}setInterval("fn()",100);  //定时器调用匿名函数/*   funct ...

  3. python 整型、字符串常用方法、for循环

    整型--int 定义:用于比较和计算 python2和python3: python2:python2中油int(整型)和long(长整型):1231312L+ 进制转换: 十进制转二进制:正除2,获 ...

  4. Django+Nginx概念安装和使用–使用Django建立你的第一个网站

    一 前记 最近在使用Django倒腾属于自己的网站,由于以前没有接触过多少这类信息,所以,很多东西都是从零开始学习的.在参考网上的资料时候,发现很多对这方面记录的,很多人都写的不是很清楚,也许我这个新 ...

  5. python科学计算与可视化视频教程

    目录: 下载链接:https://www.yinxiangit.com/616.html 第一单元TVTK入门-1.mp4第一单元TVTK入门-2.mp4第一单元TVTK入门-3.mp4 第一单元TV ...

  6. windows系统下安装JDK8

    学习JAVA,必须得安装一下JDK(java development kit java开发工具包),配置一下环境就可以学习JAVA了,下面是下载和安装JDK的教程: 一.下载 1.JDK下载地址: h ...

  7. spring boot日志logback输出

    logback是spring boot的官方推荐日志. 1.在代码中使用logback日志: import org.slf4j.Logger; import org.slf4j.LoggerFacto ...

  8. BZOJ 刷题总结(持续更新)

    本篇博客按照题号排序(带*为推荐题目) 1008 [HNOI2008]越狱 很经典的题了..龟速乘,龟速幂裸题,, 1010 [HNOI2008]玩具装箱toy* 斜率优化 基本算是裸题. 1012 ...

  9. ES6-数组的新方法

    1.Array.of() 方法创建一个具有可变数量参数的新数组实例,而不考虑参数的数量或类型. Array.of() 和 Array 构造函数之间的区别在于处理整数参数:Array.of(7)创建一个 ...

  10. Hadoop数据收集与入库系统Flume与Sqoop

    Hadoop提供了一个中央化的存储系统,其有利于进行集中式的数据分析与数据共享. Hadoop对存储格式没有要求.可以存储用户访问日志.产品信息以及网页数据等数据. 常见的两种数据来源.一种是分散的数 ...