<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                >[info]將一個請求封裝為一個對象,使發出請求的責任和執行請求的責任分割開。行為請求者與行為實現者解耦。就像軍隊里的“敬禮”,不管是誰聽到 這個命令都會做出標準的敬禮動作。這樣兩者之間通過命令對象進行溝通,這樣方便將命令對象進行儲存、傳遞、調用、增加與管理 **主要優點:** 1. 降低系統的耦合度。命令模式能將調用操作的對象與實現該操作的對象解耦。 2. 增加或刪除命令非常方便。采用命令模式增加與刪除命令不會影響其他類,它滿足“開閉原則”,對擴展比較靈活。便于添加和修改行為,便于聚合多個命令。 3. 可以實現宏命令。命令模式可以與[組合模式](http://c.biancheng.net/view/1373.html)結合,將多個命令裝配成一個組合命令,即宏命令。 4. 方便實現 Undo 和 Redo 操作。命令模式可以與后面介紹的[備忘錄模式](http://c.biancheng.net/view/1400.html)結合,實現命令的撤銷與恢復。 **缺點:** * 可能產生大量具體命令類。因為計對每一個具體操作都需要設計一個具體命令類,這將增加系統的復雜性。 ## **命令模式的應用場景** 1. 當系統需要將請求調用者與請求接收者解耦時,命令模式使得調用者和接收者不直接交互。 2. 當系統需要隨機請求命令或經常增加或刪除命令時,命令模式比較方便實現這些功能。 3. 當系統需要執行一組操作時,命令模式可以定義宏命令來實現該功能。 4. 當系統需要支持命令的撤銷(Undo)操作和恢復(Redo)操作時,可以將命令對象存儲起來,采用備忘錄模式來實現。 在軟件系統中,“行為請求者”與“行為實現者”通常呈現一種“緊耦合”。但在某些場合,比如要對行為進行“記錄、撤銷/重做、事務”等處理,這種無法抵御變化的緊耦合是不合適的。在這種情況下,如何將“行為請求者”與“行為實現者”解耦?將一組行為抽象為對象,實現二者之間的松耦合。這就是命令模式。 ### **模式的結構** 1. 抽象命令類(Command)角色:聲明執行命令的接口,擁有執行命令的抽象方法 execute()。 2. 具體命令角色(Concrete??? Command)角色:是抽象命令類的具體實現類,它擁有接收者對象,并通過調用接收者的功能來完成命令要執行的操作。 3. 實現者/接收者(Receiver)角色:執行命令功能的相關操作,是具體命令對象業務的真正實現者。 4. 調用者/請求者(Invoker)角色:是請求的發送者,它通常擁有很多的命令對象,并通過訪問命令對象來執行相關請求,它不直接訪問接收者 ![](https://img.kancloud.cn/0f/98/0f985cdc946c92ea9f54270fd9632328_567x630.png) ``` //調用者 接收具體命令類并調用具體命令類的執行方法 class Invoker { private $command; public function __construct(Command $command) { $this->command=$command; } public function setCommand(Command $command) { $this->command=$command; } public function call() { print_r("調用者執行命令command...<br>"); $this->command->execute(); } } //抽象命令 interface Command { public function execute(); } //具體命令 作用是接收接受者并執行接受者的action命令 class ConcreteCommand implements Command { private $receiver; public function __construct() { $this->receiver = new Receiver(); } public function execute() { $this->receiver->action(); } } //接收者 class Receiver { public function action() { print_r("接收者的action()方法被調用...<br>"); } } class Client { public static function main() { $command=new ConcreteCommand(); $invoker=new Invoker($command); print_r("客戶訪問調用者的call()方法...<br>"); $invoker->call(); } } Client::main(); ``` 有兩種基本的思路來實現可撤銷的操作:   1、逆向操作實現:比如被撤銷的操作是添加功能,那撤消的實現就變成刪除功能;同理被撤銷的操作是刪除功能,那么撤銷的實現就變成添加功能;   2、存儲恢復實現,意思就是把操作前的狀態記錄下來,然后要撤銷操作的時候就直接恢復回去就可以了,可使用備忘錄模式(Memento Pattern)來實現(稍后會講到備忘錄模式); ### **逆向操作來實現撤銷(undo):** ``` /** * 包含撤銷命令的接口 */ interface Command { //執行方法 public function execute(); //撤銷方法 public function undo(); } /** * 具體命令 -- 創建目錄 */ class CreateDirCommand implements Command { private $dirName;//string public $makeDir; public function __construct(MakeDir $makeDir,String $dirName) { $this->makeDir = $makeDir; $this->dirName = $dirName; } /** * 逆向操作實現:比如被撤銷的操作是添加功能,那撤消的實現就變成刪除功能;同理被撤銷的操作是刪除功能,那么撤銷的實現就變成添加功能; * @Override */ public function execute() { $this->makeDir->createDir($this->dirName); } /** * 逆向操作實現:比如被撤銷的操作是添加功能,那撤消的實現就變成刪除功能;同理被撤銷的操作是刪除功能,那么撤銷的實現就變成添加功能; * @Override */ public function undo() { $this->makeDir->deleteDir($this->dirName); } } /** * 命令接受者 * 包含兩個命令:創建目錄、刪除目錄 */ class MakeDir { //創建目錄 public function createDir(String $filename){ if (file_exists($filename)) { print_r("創建目錄 " . $filename . " 失敗,目標目錄已經存在"); }else{ //創建目錄 if (mkdir($filename,0777,true)) { print_r("創建目錄 " . $filename . " 成功"); } else { print_r("創建目錄 " . $filename . " 失敗"); } } } //刪除目錄 public function deleteDir(String $filename){ if(file_exists($filename)) { if(rmdir($filename)){ print_r("刪除目錄 " . $filename . " 成功"); }else{ print_r("刪除目錄 " . $filename . " 失敗"); } }else{ print_r("刪除目錄 " . $filename . " 失敗,目標目錄不存在"); } } } /** * 請求者 */ class RequestMakeDir { public $createCommand; public function setCreateCommand(Command $command) { $this->createCommand = $command; } public function executeCreateCommand(){ $this->createCommand->execute(); } public function undoCreateCommand(){ $this->createCommand->undo(); } } /** * 測試 */ class Client { public static function main() { $dir = "E:\\command2017"; //創建接收者 $makeDir = new MakeDir(); //創建具體命令并且指定接收者 $create_command = new CreateDirCommand($makeDir,$dir); //創建請求者 $requestMakeDir = new RequestMakeDir(); //設置命令 $requestMakeDir->setCreateCommand($create_command); /***********創建目錄及撤銷**************/ //創建目錄 $requestMakeDir->executeCreateCommand(); //撤銷 $requestMakeDir->undoCreateCommand(); } } Client::main(); ``` 多次撤銷 ``` /** * 包含撤銷命令的接口 */ interface Command { //執行方法 public function execute(String $dirName); //撤銷方法 public function undo(); } /** * 具體命令 -- 創建目錄 */ class CreateDirCommand implements Command { private $dirNameList=array();//array public $makeDir; public function __construct(MakeDir $makeDir) { $this->makeDir = $makeDir; } /** * 逆向操作實現:比如被撤銷的操作是添加功能,那撤消的實現就變成刪除功能;同理被撤銷的操作是刪除功能,那么撤銷的實現就變成添加功能; * @Override */ public function execute(String $dirName) { $this->makeDir->createDir($dirName); $this->dirNameList[]=$dirName; } /** * 逆向操作實現:比如被撤銷的操作是添加功能,那撤消的實現就變成刪除功能;同理被撤銷的操作是刪除功能,那么撤銷的實現就變成添加功能; * @Override */ public function undo() { if (count($this->dirNameList)>0) { //獲取數組中最后一個文件 $lastFile=$this->dirNameList[count($this->dirNameList)-1]; $this->makeDir->deleteDir($lastFile); //刪除成功后將存放的文件移除 array_pop($this->dirNameList); }else{ echo "沒有需要撤銷的操作!"; } } } /** * 命令接受者 * 包含兩個命令:創建目錄、刪除目錄 */ class MakeDir { //創建目錄 public function createDir(String $dirname){ if (file_exists($dirname)) { print_r("創建目錄 " . $dirname . " 失敗,目標目錄已經存在"); }else{ //創建目錄 if (mkdir($dirname,0777,true)) { print_r("創建目錄 " . $dirname . " 成功"); } else { print_r("創建目錄 " . $dirname . " 失敗"); } } } //刪除目錄 public function deleteDir(String $dirname){ if(file_exists($dirname)) { if(rmdir($dirname)){ print_r("刪除目錄 " . $dirname . " 成功"); }else{ print_r("刪除目錄 " . $dirname . " 失敗"); } }else{ print_r("刪除目錄 " . $dirname . " 失敗,目標目錄不存在"); } } } /** * 請求者 */ class RequestMakeDir { public $createCommand; public function setCreateCommand(Command $command) { $this->createCommand = $command; } public function executeCreateCommand(String $dirname){ $this->createCommand->execute($dirname); } public function undoCreateCommand(){ $this->createCommand->undo(); } } /** * 測試 */ class Client { public static function main() { //創建接收者 $makeDir = new MakeDir(); //創建具體命令并且指定接收者 $create_command = new CreateDirCommand($makeDir); //創建請求者 $requestMakeDir = new RequestMakeDir(); //設置命令 $requestMakeDir->setCreateCommand($create_command); /***********創建目錄及撤銷**************/ //創建目錄 $requestMakeDir->executeCreateCommand("E:\\command2017"); $requestMakeDir->executeCreateCommand("E:\\command2018"); $requestMakeDir->executeCreateCommand("E:\\command2019"); //多次撤銷 $requestMakeDir->undoCreateCommand(); $requestMakeDir->undoCreateCommand(); $requestMakeDir->undoCreateCommand(); $requestMakeDir->undoCreateCommand(); $requestMakeDir->undoCreateCommand(); } } Client::main(); 輸出: 創建目錄 E:\\command2017 成功創建目錄 E:\\command2018 成功創建目錄 E:\\command2019 成功刪除目錄 E:\\command2019 成功刪除目錄 E:\\command2018 成功刪除目錄 E:\\command2017 成功沒有需要撤銷的操作!沒有需要撤銷的操作! ``` ## 命令模式的擴展 在軟件開發中,有時將命令模式與前面學的組合模式聯合使用,這就構成了宏命令模式,也叫組合命令模式。宏命令包含了一組命令,它充當了具體命令與調用者的雙重角色,執行它時將遞歸調用它所包含的所有命令,其具體結構圖如圖 。 ![](https://img.kancloud.cn/f5/0d/f50da3687a58ea013b5826d06114b761_774x486.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看