轉載請注明出處: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();//發出指令
}
}
測試結果:
開燈
--------------------
關燈
總結:指令模式有很多變種,規整的指令模式會将指令委托給接收者,但我們也可以在指令包裝類中就實作指令處理邏輯。