設計模式PHP版八 - 命令模式

本篇通過去餐館用餐舉例,你去餐館需要點菜,點菜時有服務員記錄,服務員記錄完把單子交給廚師,廚師做菜。

/**
 * Interface Command 命令角色
 */
interface Command
{
    /**
     * @return mixed 執行方法
     */
    public function execute();
}

/**
 * Class ConcreteCommand 具體命令類,執行具體的行爲:廚師
 */
class ConcreteCommand implements Command
{
    /**
     * @var Receiver 用於存放Receiver類
     */
    private $_receiver;

    public function __construct(Receiver $receiver)
    {
        $this->_receiver = $receiver;
    }

    public function execute()
    {
        // 廚師一頓操作後,終於完成了
        $complete = true;

        if ($complete == true) {
            $card = '食屎啦你'; // 廚師爲了你給他帶來了今天大汗淋漓的工作,爲了表示感謝,送出了一張卡片
            $this->_receiver->action($this->_receiver->_name, $card); // 菜做好了,通知服務員上菜
        } else {
            echo '滾你丫的別BB,我還沒想出來怎麼做';
        }
    }
}

/**
 * Class Receiver 接收者角色:服務員
 */
class Receiver
{
    /**
     * @var string 服務員記錄了菜名
     */
    public $_name;

    public function __construct($name)
    {
        $this->_name = $name;
    }

    public function action($name = null, $card = null) // 這個方法是廚師那邊調用的
    {
        echo '服務員上菜: ' . $name;
        if (!empty($card)) {
            echo "<br>$card";
        }
    }
}

/**
 * Class Invoker 請求者角色:點餐的客人,你
 */
class Invoker
{
    /**
     * @var Command 存放ConcreteCommand類
     */
    private $_command;

    public function __construct(Command $command)
    {
        $this->_command = $command;
    }
    public function action()
    {
        $this->_command->execute();
    }
}

$receiver = new Receiver('滿漢全席'); // 你點了滿漢全席,服務員(Receiver類)記錄了菜名。
$command = new ConcreteCommand($receiver); // 你看着服務員拿着單子進了廚房,空着手出來,廚師拿到了單子。
$invoker = new Invoker($command); // 你確定廚房已有你這個單子了。
$invoker->action(); // 因爲你之前還有朋友沒到,朋友到了後你跟服務員說可以做菜了。

應用場景:
將命令者與執行者完全解耦。
可見,你全程都是在跟服務員互動,不用去管廚師是誰。

網上搜了很多資料,實在沒找着這模式有啥用,還是我沒理解對?

八篇下來,感覺看懂很容易,但是把作用寫出來,真的太難了。關鍵是沒幾個人看。。所以,設計模式停更。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章