首页 > 代码库 > 设计模式之命令模式

设计模式之命令模式

命令模式的核心是把方法调用封装起来,调用的对象不需要关心是如何执行的。

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

先看一个例子,设计一个家电遥控器的API,可以通过遥控器发出命令来控制不同生产商生产的家电,比如关灯、开灯。

以下是一个简单的代码示例。

 1 package cn.sp.test05;
 2 /**
 3  * 电灯类
 4  * @author 2YSP
 5  *
 6  */
 7 public class Light {
 8     
 9     public void on(){//打开
10         System.out.println("light is on");
11     }
12     
13     public void off(){//关闭
14         System.out.println("light is off");
15     }
16 }
 1 package cn.sp.test05;
 2 /**
 3  * 命令接口
 4  * @author 2YSP
 5  *
 6  */
 7 public interface Command {
 8     
 9     public void execute();
10 }
 1 package cn.sp.test05;
 2 
 3 public class LightOnCommand implements Command {
 4 
 5     Light light ; 
 6     
 7     public LightOnCommand(Light light){
 8         this.light = light;
 9     }
10     
11     @Override
12     public void execute() {
13         //调用其方法
14         light.on();
15     }
16 
17 }
 1 package cn.sp.test05;
 2 /**
 3  * 简单的遥控器类
 4  * @author 2YSP
 5  *
 6  */
 7 public class SimpleRemoteControl {
 8     Command slot;
 9 
10     public SimpleRemoteControl() {
11     }
12     
13     public void setCommand(Command command){
14         this.slot = command;
15     }
16     //按下按钮调用执行方法
17     public void buttonWasPressed(){
18         slot.execute();
19     }
20 }
 1 package cn.sp.test05;
 2 /**
 3  * 设计模式之命令模式
 4  * @author 2YSP
 5  *
 6  */
 7 public class RemoteControlTest {
 8 
 9     public static void main(String[] args) {
10         SimpleRemoteControl simpleRemoteControl = new SimpleRemoteControl();
11         Light light = new Light();
12         //命令还是得靠 电灯自己完成
13         LightOnCommand lightOn = new LightOnCommand(light);
14         //设置命令
15         simpleRemoteControl.setCommand(lightOn);
16         //执行
17         simpleRemoteControl.buttonWasPressed();
18     }
19 
20 }

运行main方法,输出light is on.

今天才发现线程池用到了这个模式。。。。

更多详细请参考Head First 设计模式。

设计模式之命令模式