设计模式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(); // 因为你之前还有朋友没到,朋友到了后你跟服务员说可以做菜了。

应用场景:
将命令者与执行者完全解耦。
可见,你全程都是在跟服务员互动,不用去管厨师是谁。

网上搜了很多资料,实在没找着这模式有啥用,还是我没理解对?

八篇下来,感觉看懂很容易,但是把作用写出来,真的太难了。关键是没几个人看。。所以,设计模式停更。。

发布了112 篇原创文章 · 获赞 75 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/weikaixxxxxx/article/details/91128307