生活随笔
收集整理的這篇文章主要介紹了
【转】设计模式学习笔记之命令模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
定義:將請求封裝成對象,以便使用不同的請求、隊列或者日志來參數化其他對象。命令模式支持可撤銷等操作。
命令模式將發出請求的對象和執行請求的對象解耦。在被解耦的兩者之間是通過命令對象進行溝通的。
案例代碼下載
案例情景:開燈和關燈操作是電燈的基本操作。我們用命令模式模擬這種情景。
Handler.java
[java] view plaincopyprint?
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 ;? ??????? }? ??? }? }?
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?
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 );? ??? }? }?
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?
public class Light {? ??? public void lightOn(){? ??????? System.out.println("開燈" );? ??? }? ??? public void lightOff(){? ??????? System.out.println("關燈" );? ??? }? }?
public class Light {public void lightOn(){System.out.println("開燈");}public void lightOff(){System.out.println("關燈");}
}
Test.java
[java] view plaincopyprint?
? 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();? ? ??? }? }?
/*** 命令模式使命令發送者與命令接收者完全解耦,他們互相不需要知道對方的邏輯實現。* 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?
開燈? --------------------? 關燈?
開燈
--------------------
關燈
總結:命令模式有很多變種,規整的命令模式會將命令委托給接收者,但我們也可以在命令包裝類中就實現命令處理邏輯。
總結
以上是生活随笔 為你收集整理的【转】设计模式学习笔记之命令模式 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。