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