本篇通過去餐館用餐舉例,你去餐館需要點菜,點菜時有服務員記錄,服務員記錄完把單子交給廚師,廚師做菜。
/**
* 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(); // 因爲你之前還有朋友沒到,朋友到了後你跟服務員說可以做菜了。
應用場景:
將命令者與執行者完全解耦。
可見,你全程都是在跟服務員互動,不用去管廚師是誰。
網上搜了很多資料,實在沒找着這模式有啥用,還是我沒理解對?
八篇下來,感覺看懂很容易,但是把作用寫出來,真的太難了。關鍵是沒幾個人看。。所以,設計模式停更。。