php設計模式之命令模式

命令模式概念

將請求封裝成對象,以便使用不一樣的請求、隊列或者日誌來參數化其餘對象。命令模式也支持可撤銷的操做。
從而實現「行爲請求者」與「行爲實現者」的鬆耦合。php

命令模式成員

抽象命令(Command):定義命令的接口,聲明執行的方法(execute、undo)
具體命令(ConcreteCommand):命令接口實現對象,一般會持有接收者,並調用接收者的功能來完成命令要執行的操做
接收者(Receiver):執行命令的對象
請求者(Invoker):調用命令對象執行請求編程

類圖

clipboard.png

實例

<?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

相關文章
相關標籤/搜索