PHP設計模式—命令模式
阿新 • • 發佈:2021-06-29
定義:
命令模式(Command):將一個請求封裝為一個物件,從而使你可用不同的請求對客戶進行引數化;對請求排隊或記錄請求日誌,以及支援可撤銷的操作。
結構:
- Command:命令抽象類,用來宣告執行操作的介面。
- ConcreteCommand:具體命令類,將一個接收者物件綁定於一個動作,呼叫接收者相應的操作。
- Invoker:命令傳送者,要求該命令執行這個請求。
- Receiver:命令接收者,知道如何實施與執行一個請求相關的操作,任何類都可能作為一個接收者。
- Client:客戶端程式碼,建立一個具體命令物件並設定它的接收者。
程式碼例項:
/** * 命令抽象類 * Interface Command*/ interface Command { /** * @return mixed */ public function execute(); } /** * 具體命令類 * Class ConcreteCommand */ class ConcreteCommand implements Command { /** * @var Receiver */ protected $receiver; /** * ConcreteCommand constructor. * @param Receiver $receiver*/ public function __construct(Receiver $receiver) { $this->receiver = $receiver; } /** * @return mixed|void */ public function execute() { // TODO: Implement execute() method. $this->receiver->action(); } } /** * 命令傳送者 * Class Invoker*/ class Invoker { /** * @var */ protected $command; /** * @param Command $command */ public function setCommand(Command $command) { $this->command = $command; } /** * 執行 */ public function run() { $this->command->execute(); } } /** * 命令接收者 * Class Receiver */ class Receiver { /** * 執行請求 */ public function action() { echo "執行請求"; } } # 客戶端程式碼 // 設定接收者 $receiver = new Receiver(); $command = new ConcreteCommand($receiver); // 傳送命令 $invoker = new Invoker(); $invoker->setCommand($command); $invoker->run();
總結:
- 命令模式把請求一個操作的物件與知道怎麼執行一個操作的物件分隔開;能較容易地設計一個命令佇列;在需要的情況下,可以較容易地將命令記錄日誌;允許接收請求的一方決定是否要否決請求;可以容易地實現對請求地撤銷和重做;由於加進新的具體命令類不影響其他的類,因此增加新的具體命令類很容易。
- 命令模式的缺點是可能會導致有過多的具體命令類。
- 命令模式適用於希望將行為請求者和行為實現者解耦,不直接打交道;希望分離掉行為請求者一部分的責任,行為請求者只需要將命令發給呼叫者,不再主動的去讓行為實現者產生行為,符合單一職責原則;希望可以控制執行的命令列表,方便記錄,撤銷/重做以及事務等功能;期待可以將請求排隊,有序執行。