转载请注明出处:http://blog.csdn.net/droyon/article/details/8719772
定义:将请求封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式支持可撤销等操作。
命令模式将发出请求的对象和执行请求的对象解耦。在被解耦的两者之间是通过命令对象进行沟通的。
案例代码下载
案例情景:开灯和关灯操作是电灯的基本操作。我们用命令模式模拟这种情景。
Handler.java
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
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
public class Light {
public void lightOn(){
System.out.println("开灯");
}
public void lightOff(){
System.out.println("关灯");
}
}
Test.java
/**
* 命令模式使命令发送者与命令接收者完全解耦,他们互相不需要知道对方的逻辑实现。
* 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();//发出命令
}
}
测试结果:
开灯
--------------------
关灯
总结:命令模式有很多变种,规整的命令模式会将命令委托给接收者,但我们也可以在命令包装类中就实现命令处理逻辑。