天天看點

設計模式學習筆記之指令模式

轉載請注明出處: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();//發出指令

	}
}
           

測試結果:

開燈
--------------------
關燈
           

總結:指令模式有很多變種,規整的指令模式會将指令委托給接收者,但我們也可以在指令包裝類中就實作指令處理邏輯。

繼續閱讀