將請求封裝成對象,以便使用不一樣的請求、隊列或者日誌來參數化其餘對象。命令模式也支持可撤銷的操做。
從而實現「行爲請求者」與「行爲實現者」的鬆耦合。php
抽象命令(Command):定義命令的接口,聲明執行的方法(execute、undo)
具體命令(ConcreteCommand):命令接口實現對象,一般會持有接收者,並調用接收者的功能來完成命令要執行的操做
接收者(Receiver):執行命令的對象
請求者(Invoker):調用命令對象執行請求編程
<?php /** * 抽象命令(Command) * Interface Command */ interface Command{ /** * 執行接口 * @return mixed */ public function execute(); /** * 撤銷接口 * @return mixed */ public function undo(); } /** * 命令接收者(Receiver) * Class Light */ class Light{ public function on(){ echo 'light on'; } public function off(){ echo 'light off'; } } /** * 具體命令(ConcreteCommand) * Class LightOn */ class LightOn implements Command{ private $light; public function __construct(Light $light) { $this->light = $light; } public function execute() { $this->light->on(); } public function undo() { $this->light->off(); } } /** * 具體命令(ConcreteCommand) * Class LightOff */ class LightOff implements Command{ private $light; public function __construct(Light $light) { $this->light = $light; } public function execute() { $this->light->off(); } public function undo() { $this->light->on(); } } /** * 請求者(Invoker) * Class Control */ class Control{ protected $object; public function __construct($object) { $this->object = $object; } public function exec(){ $this->object->execute(); } public function undo(){ $this->object->undo(); } } $light = new Light(); $light_on = new LightOn($light); $control = new Control($light_on); $control->exec(); echo '<br />'; $control->undo();
1.封裝變化
2.多用組合,少用繼承
3.針對接口編程,不針對實現編程
4.爲交互對象之間鬆耦合設計而努力
5.類應該對擴展開放,對修改關閉
6.依賴抽象、不要依賴具體類設計模式
1.命令模式將發出請求的對象和執行請求的對象解耦
2.在被解耦的二者之間經過命令對象進行溝通。命令對象封裝了接收者和一個或一組動做
3.調用者經過調用命令對象的execute方法發出請求,這樣使得接受者的動做被調用
4.調用者能夠接受命令當作參數,甚至在運行時動態的進行
5.命令能夠支持撤銷,作法實現一個undo的方法來回到execute被執行前的狀態
6.命令也能夠用來實現日誌、事物系統、隊列this
參考文獻《head first設計模式》spa