设计模式----行为型模式之命令模式(Command Pattern)
下面来自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)的更多相关文章
- 设计模式---行为变化模式之命令模式(Command)
前提:行为变化模式 在组件的构建过程中,组建行为的变化经常导致组件本身剧烈的变化.“行为变化”模式将组件的行为和组件本身进行解耦,从而支持组件的变化,实现两者之间的松耦合. 类中非虚函数和静态函数方法 ...
- Java进阶篇设计模式之八 ----- 责任链模式和命令模式
前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command ...
- Java设计模式之八 ----- 责任链模式和命令模式
前言 在上一篇中我们学习了结构型模式的享元模式和代理模式.本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command ...
- C#设计模式学习笔记:(14)命令模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7873322.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第二个模式--命 ...
- IOS设计模式之四(备忘录模式,命令模式)
本文原文请见:http://www.raywenderlich.com/46988/ios-design-patterns. 由 @krq_tiger(http://weibo.com/xmuzyq) ...
- 设计模式之第14章-命令模式(Java实现)
设计模式之第14章-命令模式(Java实现) “小明,滚出去.”“小明,这个问题怎么做?”(可怜的小明无奈躺枪.小明:老师,我和你有什么仇什么怨,我和你有什么仇什么怨啊到底...老师:小明,滚出去.习 ...
- IDEA terminal无法从vim的编辑模式转换为命令模式
Git 修改最后一次的commit历史记录:https://www.baidu.com/link?url=2WF8yFd0iBuVmXLWfutmSoXa12K9D143e_B0A3PTYYHEP9r ...
- 设计模式14---设计模式之命令模式(Command)(行为型)
1.场景模拟 请用软件模拟开机过程 按下启动按钮 然后电源供电 主板开始加电自检 BIOS依次寻找其他设备的BIOS并且让他们初始化自检 开始检测CPU,内存,光盘,硬盘,光驱,串口,并口,软驱即插即 ...
- .NET设计模式(17):命令模式(Command Pattern)(转)
概述 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”.但在某些场合,比如要对行为进行“记录.撤销/重做.事务”等处理,这种无法抵御变化的紧耦合是不合适的.在这种情况下,如何将“行为 ...
随机推荐
- codeforces 572 C. Lengthening Sticks(数学)
题目链接:http://codeforces.com/contest/572/problem/C 题意:给出a,b,c,l要求a+x,b+y,c+z构成三角形,x+y+z<=l,成立的x,y,z ...
- 【Offer】[31] 【栈的压入、弹出序列】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如,序列{1,2,3 ...
- centos7 kubernetes单机安装
单机版的kubernetes 适合初学者,对kuber有个很好的入门. 因为centos系统内置了安装源.我们可以直接安装 1.yum install -y etco kubernetes 2.whe ...
- c语言实现数组的排序
本文章只对选择排序和冒泡排序进行介绍 选择排序实际上是从0到length-1,选择某个元素与其他的元素进行大小比较,如果大于就交换,其他情况不做操作,如图: 冒泡排序实际上是先选择某个元素,然后从 ...
- 阿里社招Java面试题总结——面试官分享
面试题 1.Java中的内存溢出是如何造成的 2.gc的概念,如果A和B对象循环引用,是否可以被GC? 3.Error.Exception和RuntimeException的区别,作用又是什么? 4. ...
- 解锁HMC8及HMC9的root用户
某天需要用HMC的root用户干点“坏事”,发现找了一圈都没有正确的HMC v8及v9的root用户破解教程,然后自己研究了一下,发现可以用root用户了.本文测试用的HMC以VMware works ...
- springBoot异常统一处理
springBoot异常统一处理 采用@ControllerAdvice注解和@ExceptionHandler注解,可以对异常进行统一处理. 1.结构图: 2.pom.xml文件: <?xml ...
- 洛谷 P1181数列分段Section I
星爆气流(弃疗)斩! ——<刀剑神域> 题目:https://www.luogu.org/proble ...
- jmeter运行第三方java项目
自己写了个简化系统操作的小工具,因为不想给别人用的时候占用本地资源于是写的是纯java项目,后面放到jmeter中通过beanshell sampler调用. java源码不贴了,把写好的项目导出成可 ...
- [Advanced Python] 13 - "Decorator": syntactic sugar
单独一章复习:Python 函数装饰器,廖雪峰讲装饰器 基本概念 函数作为变量 从函数中返回函数 子函数写在外面貌似也可以,可这样就少了“封装性”. def greet(): return " ...