10_命令模式
【命令模式】
命令模式是一個高內(nèi)聚的模式。
將一個請求封裝成一個對象,從而讓你使用不用的請求將客戶端參數(shù)化,對請求排隊或者記錄請求日志,提供命令的撤銷和恢復(fù)功能。
命令模式由以下4部分組成:
1.Receiver接受者角色
該角色是具體做事的角色,命令傳遞到這里被執(zhí)行。
2.Command抽象命令角色
需要執(zhí)行的命令在這里聲明。
3.ConcreteCommand具體命令角色
通常會關(guān)聯(lián)接受者(例子里的游戲人物:戰(zhàn)士角色類),并調(diào)用接受者的功能來完成具體的操作。
4.Invoker調(diào)用者角色
接受到命令,并執(zhí)行命令。(例子中的游戲玩家)
?
命令模式較為簡單,它的封裝性較好,把請求方(Invoker)和執(zhí)行方(接收方,Receiver)分開,保證了其擴展性。
?
【命令模式 例子】
package com.Higgin.Command;/*** 接受者角色:Receiver* 游戲中的戰(zhàn)士類*/ class Soldier{public void shoot(){System.out.println("戰(zhàn)士射擊!!!");}public void run(){System.out.println("戰(zhàn)士奔跑!!!");} }/*** 命令角色:Command* 抽象命令角色*/ interface Command{public void execute(); }/*** 具體命令角色:ConcreteCommand* 具體的射擊命令角色*/ class ConcreteShootCommand implements Command{private Soldier soldier; //關(guān)聯(lián)戰(zhàn)士角色類public ConcreteShootCommand(Soldier soldier){this.soldier=soldier;}@Overridepublic void execute() {this.soldier.shoot();} } /*** 具體命令角色:ConcreteCommand* 具體的奔跑命令角色*/ class ConcreteRunCommand implements Command{private Soldier soldier; //關(guān)聯(lián)戰(zhàn)士角色類public ConcreteRunCommand(Soldier soldier){this.soldier=soldier;}@Overridepublic void execute() {this.soldier.run();} }/*** 調(diào)用者角色:Invoker* 游戲玩家角色*/ class GamePlayer{private Command shootCommand; //射擊命令private Command runCommand; //奔跑命令public void setShootCommand(Command shootCommand) {this.shootCommand = shootCommand;}public void setRunCommand(Command runCommand) {this.runCommand = runCommand;}public void shoot(){ this.shootCommand.execute();}public void run(){this.runCommand.execute();} }public class TestCommand {public static void main(String[] args) {Soldier soldier=new Soldier(); //戰(zhàn)士角色GamePlayer gamePlayer=new GamePlayer(); //游戲玩家角色 Command shootCommand=new ConcreteShootCommand(soldier); //射擊命令 gamePlayer.setShootCommand(shootCommand);gamePlayer.shoot();Command runCommand=new ConcreteRunCommand(soldier); //奔跑命令 gamePlayer.setRunCommand(runCommand);gamePlayer.run();} }【運行結(jié)果】
?
【優(yōu)點】
* 類間解耦
調(diào)用者和接收者之間沒有任何依賴關(guān)系。調(diào)用者實現(xiàn)功能時只需調(diào)用Command抽象類的execute方法即可,不需要了解到底哪個是接收者。
* 可擴展性
Command類的子類ConcreteCommand具體命令角色可以非常容易地擴展,而調(diào)用者Invoker和高層次的模塊Client不產(chǎn)生嚴重的代碼耦合問題。
* 命令模式結(jié)合其他模式會更優(yōu)秀
命令模式可以結(jié)合責(zé)任鏈模式,實現(xiàn)命令族解析任務(wù)。
也可以結(jié)合模板方法模式,則可以減少Command子類的膨脹問題。
?
【缺點】
如果有N個命令,Command的子類就會是N個,會使得這個子類數(shù)量膨脹地非常多。
?
轉(zhuǎn)載于:https://www.cnblogs.com/HigginCui/p/6222345.html
總結(jié)
- 上一篇: 20145307《信息安全系统设计基础》
- 下一篇: MFC CTreeCtrl运用