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

命令模式将发出请求的对象和执行请求的对象解耦。在被解耦的两者之间是通过命令对象进行沟通的。

案例代码下载

案例情景:开灯和关灯操作是电灯的基本操作。我们用命令模式模拟这种情景。

Handler.java

[java] view plaincopyprint?
  1. public class Handler {
  2. public static final int LIGHT_OPEN = 0;
  3. public static final int LIGHT_CLOSE= 1;
  4. public void handleMessage(Message msg){
  5. int what = msg.what;
  6. Light l = (Light) msg.obj;
  7. switch(what){
  8. case LIGHT_OPEN :
  9. l.lightOn();
  10. break;
  11. case LIGHT_CLOSE:
  12. l.lightOff();
  13. break;
  14. }
  15. }
  16. }
public class Handler {public static final int LIGHT_OPEN = 0;public static final int LIGHT_CLOSE= 1;public void handleMessage(Message msg){int what = msg.what;Light l = (Light) msg.obj;switch(what){case LIGHT_OPEN :l.lightOn();break;case LIGHT_CLOSE:l.lightOff();break;}}
}

Message.java

[java] view plaincopyprint?
  1. public class Message {
  2. int what;
  3. int arg1;
  4. int arg2;
  5. Object obj;
  6. Handler mHandler;
  7. public Message(int what,Object obj){
  8. this.what = what;
  9. this.obj = obj;
  10. }
  11. public void setTarget(Handler handler){
  12. mHandler = handler;
  13. }
  14. public void sendMessage(){
  15. mHandler.handleMessage(this);
  16. }
  17. }
public class Message {int what;int arg1;int arg2;Object obj;Handler mHandler;public Message(int what,Object obj){this.what = what;this.obj = obj;}public void setTarget(Handler handler){mHandler = handler;}public void sendMessage(){mHandler.handleMessage(this);}
}

Light.java

[java] view plaincopyprint?
  1. public class Light {
  2. public void lightOn(){
  3. System.out.println("开灯");
  4. }
  5. public void lightOff(){
  6. System.out.println("关灯");
  7. }
  8. }
public class Light {public void lightOn(){System.out.println("开灯");}public void lightOff(){System.out.println("关灯");}
}

Test.java

[java] view plaincopyprint?
  1. /**
  2. * 命令模式使命令发送者与命令接收者完全解耦,他们互相不需要知道对方的逻辑实现。
  3. * Message即是命令的包装者,也是命令的发送者,其实真正的发送者是Handler
  4. * 客户端也就是命令的接收者,Light,怎么开灯,怎么关灯,我们不需要知道其内部逻辑,我们只需发出命令。
  5. * @author
  6. *
  7. */
  8. public class Test {
  9. public static void main(String args[]){
  10. Handler handler = new Handler();
  11. Light light = new Light();//命令接收者
  12. Message lightOn = new Message(handler.LIGHT_OPEN, light);//包装一条开灯的消息
  13. Message lightOff = new Message(handler.LIGHT_CLOSE, light);//包装一条关灯的消息
  14. lightOff.setTarget(handler);
  15. lightOn.setTarget(handler);
  16. lightOn.sendMessage();//发出命令
  17. System.out.println("--------------------");
  18. lightOff.sendMessage();//发出命令
  19. }
  20. }
/*** 命令模式使命令发送者与命令接收者完全解耦,他们互相不需要知道对方的逻辑实现。* Message即是命令的包装者,也是命令的发送者,其实真正的发送者是Handler* 客户端也就是命令的接收者,Light,怎么开灯,怎么关灯,我们不需要知道其内部逻辑,我们只需发出命令。* @author**/
public class Test {public static void main(String args[]){Handler handler = new Handler();Light light = new Light();//命令接收者Message lightOn = new Message(handler.LIGHT_OPEN, light);//包装一条开灯的消息Message lightOff = new Message(handler.LIGHT_CLOSE, light);//包装一条关灯的消息lightOff.setTarget(handler);lightOn.setTarget(handler);lightOn.sendMessage();//发出命令System.out.println("--------------------");lightOff.sendMessage();//发出命令}
}

测试结果:

[java] view plaincopyprint?
  1. 开灯
  2. --------------------
  3. 关灯
开灯
--------------------
关灯

总结:命令模式有很多变种,规整的命令模式会将命令委托给接收者,但我们也可以在命令包装类中就实现命令处理逻辑。

【转】设计模式学习笔记之命令模式相关推荐

  1. 设计模式学习笔记——解释器(Interpreter)模式

    设计模式学习笔记--解释器(Interpreter)模式 @(设计模式)[设计模式, 解释器模式, Interpreter] 设计模式学习笔记解释器Interpreter模式 基本介绍 解释器案例 类 ...

  2. 设计模式学习笔记——代理(Proxy)模式

    设计模式学习笔记--代理(Proxy)模式 @(设计模式)[设计模式, 代理模式, proxy] 设计模式学习笔记代理Proxy模式 基本介绍 代理案例 类图 实现代码 Printable接口 Pri ...

  3. 设计模式学习笔记——状态(State)模式框架

    设计模式学习笔记--状态(State)模式框架 @(设计模式)[设计模式, 状态模式, State] 设计模式学习笔记状态State模式框架 基本介绍 状态案例 类图 实现代码 State接口 Day ...

  4. 设计模式学习笔记——备忘录(Memento)模式

    设计模式学习笔记--备忘录(Memento)模式 @(设计模式)[设计模式, 备忘录模式, memento] 设计模式学习笔记备忘录Memento模式 基本介绍 备忘录案例 类图 实现代码 Memen ...

  5. 设计模式学习笔记——观察者(Observer)模式

    设计模式学习笔记--观察者(Observer)模式 @(设计模式)[设计模式, 观察者模式, Observer] 设计模式学习笔记观察者Observer模式 基本介绍 观察者案例 类图 实现代码 Ob ...

  6. 设计模式学习笔记——外观(Facade)模式

    设计模式学习笔记--外观(Facade)模式 @(设计模式)[设计模式, 外观模式, facade] 设计模式学习笔记外观Facade模式 基本介绍 外观案例 类图 实现代码 Database类 ma ...

  7. 设计模式学习笔记——访问者(Visitor)模式

    设计模式学习笔记--访问者(Visitor)模式 @(设计模式)[设计模式, 访问者模式, visitor] 设计模式学习笔记访问者Visitor模式 基本介绍 访问者案例 类图 实现代码 Visit ...

  8. 设计模式学习笔记——装饰(Decorator)模式

    设计模式学习笔记--装饰(Decorator)模式 @(设计模式)[设计模式, 装饰模式, decorator] 设计模式学习笔记装饰Decorator模式 基本介绍 装饰案例 类图 实现代码 Dis ...

  9. 设计模式学习笔记——组合(Composite)模式

    设计模式学习笔记--组合(Composite)模式 @(设计模式)[设计模式, 组合模式, composite] 设计模式学习笔记组合Composite模式 基本介绍 组合案例 类图 实现代码 Ent ...

最新文章

  1. Navicat for Oracle
  2. python从入门到精通pdf百度云下载-Python从入门到精通PDF高清完整版免费下载|百度云盘...
  3. zoj 2760 How Many Shortest Path 最大流
  4. 堆栈中的EIP EBP ESP
  5. json解析详解 java_Java解析Json数据的两种方式详解
  6. pyhanlp 命名实体识别
  7. 继承jpanel不显示_房产继承全指南
  8. Linux之命令行快捷键(记住的我没写)
  9. 【STM32】GPIO之LED
  10. 初识Mysql(part3)--我需要知道的7条Mysql语句之检索数据
  11. OpenGLES渲染
  12. 从零开始学习python编程-从零开始学Python程序设计 PDF 完整影印版
  13. 浏览器输入网址回车发生的事情?--
  14. Atitit. Ati IDE 开发平台的第一版规划
  15. ServletContext的用法
  16. VS2015卸载重装之后点击没有反应
  17. 通俗易懂的数学建模示例(一)
  18. 今日头条php笔试题,2017年今日头条笔试题目
  19. DFS:寻路问题(Roads)
  20. python里面的pip是什么意思_为什么您应该使用`python -m pip`

热门文章

  1. shell执行docker命令卡挂住_Docker官方文档翻译4
  2. echarts 获取点击的y轴数值_有机磷酸催化对醌的不对称直接加成反应合成轴手性芳基醌类化合物...
  3. php 控制器分组模式,控制器分组路由
  4. [收藏]7个可以调研B端产品的网站
  5. 网易严选宣布退出双11?
  6. python如何爬取sci论文中所需的数据_sci论文中的科研数据处理方法
  7. 【计算机网络】因特网结构
  8. 【项目管理】对RUP的几点深入思考
  9. 【计算机科学基础】整数和小数的进制转换
  10. 【Java】JShell工具上手即用