下面来自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设计模式书中。

  

  

  

  

   

最新文章

  1. redis 学习笔记(1)
  2. 利用JavaScript生成随机数字!
  3. 实现PD控制
  4. zw版【转发·台湾nvp系列Delphi例程】HALCON color_fuses2
  5. codeforces 340A The Wall(简单数学题)
  6. hdoj 2544 最短路【dijkstra or spfa】
  7. [DEncrypt] RSACryption--RSA加密/解密字符串 (转载)
  8. [转]spring mvc注解方式实现向导式跳转页面
  9. linux 命令实现原理
  10. JavaScript的几种常见的创建方式
  11. [BZOJ1061] [Noi2008] 志愿者招募 (费用流)
  12. java 一维数组
  13. January 19th, 2018 Week 3rd Friday
  14. 010、base镜像 (2018-12-27 周四)
  15. Java8 容器类详解
  16. js将字符串转json
  17. spring项目读取配置的demo
  18. oracle逐步学习总结之约束(基础五)
  19. mac zsh不自动加载~/.bashrc
  20. 监控生产线上服务器的docker容器及主机

热门文章

  1. Atcoder E - Meaningful Mean(线段树+思维)
  2. codeforces 749D Leaving Auction(二分)
  3. 【Offer】[58-2] 【左旋转字符串】
  4. 【LeetCode】103# 二叉树的锯齿形层次遍历
  5. .net core 自定义404 500页面
  6. mybatis源码专题(2)--------一起来看下使用mybatis框架的insert语句的源码执行流程吧
  7. Qt疑难问题-模态窗口父类被析构
  8. 译 .NET Core 3.0 发布
  9. 第六届蓝桥杯java b组第五题
  10. Android [启动方式:standard singleTop singleTask singleInstance]