亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

命令(Command)模式

系統 2047 0
命令(Command)模式 :又稱Action模式或者Transaction模式。它屬于對象的行為模式。命令模式把一個請求或者操作封裝到一個對象中。命令模式允許系統使用不同的請求把客戶端參數化,對請求排隊或者記錄請求日志,可以提供命令的撤銷和撤銷功能。
GoF命令模式結構圖如下:
命令(Command)模式
?
?
?命令模式是有以下角色:
抽象命令(Command)角色 :聲明執行操作的接口。
具體命令(ConcreteCommand)角色 :將一個接收者對象綁定到一個動作上。調用接收者相應的操作,以實現Execute方法。
客戶端(Client)角色 :創建一個命令對象并設定它的接收者。
請求者(Invoker)角色 :負責調用命令對象的執行請求;
接收者(Receiver)角色 :負責具體實施和執行一個請求相關的操作。任何一個類都可以作為一個接收者。
上面模型的模擬代碼如下:
Java代碼?? 收藏代碼
  1. package ?command;??
  2. /** ?
  3. ?*? ?
  4. ?*作者:alaric ?
  5. ?*時間:2013-8-20下午7:39:48 ?
  6. ?*描述:接收者角色 ?
  7. ?*/ ??
  8. public ? class ?Receiver?{??
  9. ??
  10. ???? public ?Receiver()?{??
  11. ???????? super ();??
  12. ????}??
  13. ??
  14. ???? /** ?
  15. ?????*? ?
  16. ?????*作者:alaric ?
  17. ?????*時間:2013-8-20下午7:40:00 ?
  18. ?????*描述:行動方法 ?
  19. ?????*/ ??
  20. ???? public ? void ?action(){??
  21. ????????System.out.println( "接收者接到命令,開始行動" );??
  22. ????}??
  23. }??
?
Java代碼?? 收藏代碼
  1. package ?command;??
  2. /** ?
  3. ?*? ?
  4. ?*作者:alaric ?
  5. ?*時間:2013-8-20下午7:36:51 ?
  6. ?*描述:抽象命令角色 ?
  7. ?*/ ??
  8. public ? interface ?Command?{??
  9. ??
  10. ???? /** ?
  11. ?????*? ?
  12. ?????*作者:alaric ?
  13. ?????*時間:2013-8-20下午7:36:40 ?
  14. ?????*描述:執行方法 ?
  15. ?????*/ ??
  16. ???? public ? void ?execute();??
  17. }??
?
Java代碼?? 收藏代碼
  1. package ?command;??
  2. /** ?
  3. ?*? ?
  4. ?*作者:alaric ?
  5. ?*時間:2013-8-20下午7:37:10 ?
  6. ?*描述:具體命令角色 ?
  7. ?*/ ??
  8. public ? class ?ConcreteCommand? implements ?Command?{??
  9. ??
  10. ???? private ?Receiver?receiver;??
  11. ??????
  12. ??????
  13. ???? public ?ConcreteCommand(Receiver?receiver)?{??
  14. ???????? super ();??
  15. ???????? this .receiver?=?receiver;??
  16. ????}??
  17. ??
  18. ??
  19. ???? @Override ??
  20. ???? public ? void ?execute()?{??
  21. ??????????
  22. ????????receiver.action();??
  23. ??????????
  24. ????}??
  25. ??????
  26. ??
  27. }??
?
Java代碼?? 收藏代碼
  1. package ?command;??
  2. /** ?
  3. ?*? ?
  4. ?*作者:alaric ?
  5. ?*時間:2013-8-20下午7:41:07 ?
  6. ?*描述: ?
  7. ?*/ ??
  8. public ? class ?Invoker?{??
  9. ??
  10. ???? private ?Command?command;??
  11. ??
  12. ???? public ?Invoker(Command?command)?{??
  13. ???????? super ();??
  14. ???????? this .command?=?command;??
  15. ????}??
  16. ??????
  17. ???? public ? void ?action(){??
  18. ????????command.execute();??
  19. ????}??
  20. }??
?
Java代碼?? 收藏代碼
  1. package ?command;??
  2. /** ?
  3. ?*? ?
  4. ?*作者:alaric ?
  5. ?*時間:2013-8-20下午7:33:51 ?
  6. ?*描述:客戶端角色 ?
  7. ?*/ ??
  8. public ? class ?Client?{??
  9. ??
  10. ???? /** ?
  11. ?????*作者:alaric ?
  12. ?????*時間:2013-8-20下午7:33:44 ?
  13. ?????*描述: ?
  14. ?????*/ ??
  15. ???? public ? static ? void ?main(String[]?args)?{??
  16. ????????Receiver?receiver?=? new ?Receiver();??
  17. ????????Command?command?=? new ?ConcreteCommand(receiver);??
  18. ????????Invoker?invoker?=? new ?Invoker(command);??
  19. ????????invoker.action();??
  20. ????}??
  21. ??
  22. }??
?命令模式是對命令的封裝,它把發出命令的責任和執行命令的責任分隔開,委派給不同的對象。每一個命令都是一個操作,請求的一方發出請求要求執行一個操作;接收的一方收到請求并執行操作。命令模式允許請求的一方和接收的一方獨立開來,使得請求的一方不必知道接收請求的一方接口,更不必知道請求是怎么被接收,以及操作是否被執行,何時被執行,以及是怎么被執行的。命令允許請求方和接收方各自都能獨立演化,從而具有以下優點:
1、命令模式使新的命令在不改變現有結構代碼的情況下很容易被加入到系統里;
2、允許接收請求的一方決定是否否決請求;
3、能較容易地設計一個命令隊列;
4、可以容易地實現對請求的Undo和Redo操作;
5、在需要的情況下以較容易地將命令記入日志。
?
在講門面模式的時候曾經提過一個例子,我們小時玩過投幣的那種游戲機,一個方向操作桿,四個動作按鈕,在一個操作面板上,封裝了復雜的邏輯在機器內部,提供簡單的操作界面,是一個門面的例子,然而每個操作發出一個命令,來控制游戲人物的運動和各種動作。方向操作桿是一個移動的命令,傳入移動的方向和距離作為參數,還有出拳按鍵發出出拳命令,腳踢按鍵發出腳踢的命令,那還有組合操作命令,比如下踢腿(操作桿向下和踢腳按鈕按下)。現在我們用命令模式來模擬這個場景。類的模型圖如下:

命令(Command)模式
?如上圖所示:Client相當于小時候的我們,Control相關于控制執行器,我們可以控制踢(KickCommand)、打(FistCommand)、移動(MoveCommand),這些命令的最終實現者也是接收者是游戲機(GameMachine)。
代碼如下:
Java代碼?? 收藏代碼
  1. package ?command.example;??
  2. /** ?
  3. ?*? ?
  4. ?*作者:alaric ?
  5. ?*時間:2013-8-21上午7:15:53 ?
  6. ?*描述:接收者 ?
  7. ?*/ ??
  8. public ? class ?GameMachine?{??
  9. ??
  10. ???? public ? void ?fist()?{??
  11. ????????System.out.println( "出拳" );??
  12. ????}??
  13. ??????
  14. ???? public ? void ?kick()?{??
  15. ????????System.out.println( "出腳" );??
  16. ????}??
  17. ??????
  18. ???? public ? void ?move(String?direction){??
  19. ????????System.out.println( "向" +direction+ "移動" );??
  20. ????}??
  21. ??
  22. }??
?
Java代碼?? 收藏代碼
  1. package ?command.example;??
  2. /** ?
  3. ?*? ?
  4. ?*作者:alaric ?
  5. ?*時間:2013-8-20下午10:20:35 ?
  6. ?*描述:命令接口 ?
  7. ?*/ ??
  8. public ? interface ?Command?{??
  9. ??
  10. ???? //執行方法 ??
  11. ???? public ? void ?execute();??
  12. ??????
  13. ???? //這里還可以加入撤銷方法,回滾方法等 ??
  14. }??
?
Java代碼?? 收藏代碼
  1. package ?command.example;??
  2. /** ?
  3. ?*? ?
  4. ?*作者:alaric ?
  5. ?*時間:2013-8-21上午7:17:02 ?
  6. ?*描述:拳打 ?
  7. ?*/ ??
  8. public ? class ?FistCommand? implements ?Command?{??
  9. ???? private ?GameMachine?machine;??
  10. ??????
  11. ??????
  12. ??????
  13. ???? public ?FistCommand(GameMachine?machine)?{??
  14. ???????? super ();??
  15. ???????? this .machine?=?machine;??
  16. ????}??
  17. ??
  18. ??
  19. ??
  20. ???? @Override ??
  21. ???? public ? void ?execute()?{??
  22. ????????machine.fist();??
  23. ????}??
  24. ??
  25. ??
  26. }??
?
Java代碼?? 收藏代碼
  1. package ?command.example;??
  2. /** ?
  3. ?*? ?
  4. ?*作者:alaric ?
  5. ?*時間:2013-8-21上午7:42:21 ?
  6. ?*描述:腳踢命令 ?
  7. ?*/ ??
  8. public ? class ?KickCommand? implements ?Command?{??
  9. ???? private ?GameMachine?machine;??
  10. ??????
  11. ???? public ?KickCommand(GameMachine?machine)?{??
  12. ???????? super ();??
  13. ???????? this .machine?=?machine;??
  14. ????}??
  15. ??
  16. ???? @Override ??
  17. ???? public ? void ?execute()?{??
  18. ????????machine.kick();??
  19. ????}??
  20. ??
  21. }??
?
Java代碼?? 收藏代碼
  1. package ?command.example;??
  2. /** ?
  3. ?*? ?
  4. ?*作者:alaric ?
  5. ?*時間:2013-8-21上午7:17:02 ?
  6. ?*描述:移動命令 ?
  7. ?*/ ??
  8. public ? class ?MoveCommand? implements ?Command?{??
  9. ???? private ?GameMachine?machine;??
  10. ???? private ?String?direction;??
  11. ??????
  12. ??????
  13. ???? public ?MoveCommand(GameMachine?machine,String?direction)?{??
  14. ???????? super ();??
  15. ???????? this .machine?=?machine;??
  16. ???????? this .direction?=?direction;??
  17. ????}??
  18. ??
  19. ??
  20. ??
  21. ???? @Override ??
  22. ???? public ? void ?execute()?{??
  23. ????????machine.move(direction);??
  24. ????}??
  25. ??
  26. ??????
  27. ??
  28. }??
?
Java代碼?? 收藏代碼
  1. package ?command.example;??
  2. /** ?
  3. ?*? ?
  4. ?*作者:alaric ?
  5. ?*時間:2013-8-21上午7:43:14 ?
  6. ?*描述:控制類 ?
  7. ?*/ ??
  8. public ? class ?Control?{??
  9. ??????
  10. ???? private ?Command?fistCommand;??
  11. ???? private ?Command?kickCommand;??
  12. ???? private ?Command?moveCommand;??
  13. ??????
  14. ???? public ?Control(Command?fistCommand,?Command?kickCommand,?Command?moveCommand)?{??
  15. ???????? super ();??
  16. ???????? this .fistCommand?=?fistCommand;??
  17. ???????? this .kickCommand?=?kickCommand;??
  18. ???????? this .moveCommand?=?moveCommand;??
  19. ????}??
  20. ??????
  21. ???? public ? void ?fist(){??
  22. ????????fistCommand.execute();??
  23. ????}??
  24. ??????
  25. ???? public ? void ?kick(){??
  26. ????????kickCommand.execute();??
  27. ????}??
  28. ??????
  29. ???? public ? void ?move(){??
  30. ????????moveCommand.execute();??
  31. ????}??
  32. ??
  33. }??
?
Java代碼?? 收藏代碼
  1. package ?command.example;??
  2. /** ?
  3. ?*? ?
  4. ?*作者:alaric ?
  5. ?*時間:2013-8-20下午9:26:42 ?
  6. ?*描述:客戶端角色 ?
  7. ?*/ ??
  8. public ? class ?Client?{??
  9. ??
  10. ???? /** ?
  11. ?????*作者:alaric ?
  12. ?????*時間:2013-8-20下午9:26:36 ?
  13. ?????*描述:測試 ?
  14. ?????*/ ??
  15. ???? public ? static ? void ?main(String[]?args)?{??
  16. ??
  17. ????????GameMachine?machine?=? new ?GameMachine();??
  18. ????????Command?fistCommand?=? new ?FistCommand(machine);??
  19. ????????Command?kickCommand?=? new ?KickCommand(machine);??
  20. ????????Command?moveCommand?=? new ?MoveCommand(machine,? "左" );??
  21. ??????????
  22. ????????Control?control?=? new ?Control(fistCommand,?kickCommand,?moveCommand);??
  23. ????????control.fist();??
  24. ????????control.kick();??
  25. ????????control.move();??
  26. ??????????
  27. ???????? //其實在不同命令模式的情況下就是下面這樣直接調用, ??
  28. ???????? //就會讓調用者和實際命令執行者緊緊耦合在一起,還有一個好處 ??
  29. ???????? //就是可以在 ??
  30. ???????? //machine.fist(); ??
  31. ???????? //machine.kick(); ??
  32. ???????? //machine.move("左"); ??
  33. ????}??
  34. ??
  35. }??

?運行結果如下:

出拳

出腳

向左移動

?
通過上面代碼可以看出,本來客戶端可以直接調用接收者來執行動作的,現在在中間引入了命令,這些命令由調用者(Invoker這里是Control)來調用,從而對客戶端和命令接收者解耦了,增加了命令后,使得命令除了execute方法外,可以插入很多其它動作,比如redo,undo,或者記錄日志等。

命令(Command)模式


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 一类毛片| 色综合网址 | 国产精品一区在线免费观看 | 日日摸夜夜添夜夜添影院视频 | 欧美成人性生活视频 | 国产成人精品综合久久久 | 免费女人18毛片a级毛片视频 | 一级毛片视频播放 | 四虎永久免费在线观看 | 日日碰天天久久 | 日产国产欧美视频一区精品 | 自拍视频精品 | 亚洲国产精品yw在线观看 | 欧美一级毛片不卡免费观看 | 北岛玲日韩精品一区二区三区 | 久久视屏这里只有精品6国产 | 美女被羞羞视频网站在线 | jizz18性欧美大全 | 国产一区二区在线 |播放 | 欧美精品免费在线 | 天天擦天天干 | 久久精品7 | 国产999视频| 欧美精品国产第一区二区 | 亚洲高清在线mv | 一级网站在线观看 | 五月天丁香婷婷综合 | 幻女bbwxxxxyounu| 色狠狠综合 | 欧美大片国产在线永久播放 | 国产精品久久久久久搜索 | 亚洲综合图片区 | 中文字幕一区2区3区 | 亚洲另类第一页 | 色久综合 | 亚洲mv| 国产精品v欧美精品∨日韩 国产精品v一区二区三区 | 亚洲综合激情六月婷婷在线观看 | 国产美女mm131爽爽爽免费 | 国产欧美一区二区久久 | 91在线小视频 |