PHP 命令模式

本文介绍了软件设计中的命令模式,包括其组成、优点及缺点,并通过PHP示例代码展示了命令模式的具体应用。

命令模式是一种高内聚的模式,其定义为:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或记录请求日志,可以提供命令的撤销和恢复功能。

  • 命令模式组成

    1. Receive接收者角色:该角色就是干活的角色,命令传递到这里是应该被执行的。
    2. Command命令角色:需要执行的所有命令都在这里声明。
    3. Invoker调用者角色:接收到命令,并执行命令。
  • 命令模式的优点

    1. 类间解耦:调用者角色与接收者角色之间没有任何依赖关系,调用者实现功能时只需调用Command抽象类的execute方法就可以,不需要了解到底是哪个接收者执行。
    2. 可扩展性:Command的子类可以非常容易地扩展,而调用者Invoker和高层次的模块Client不产生严重的代码耦合。
    3. 命令模式结合其他模式:命令模式可以结合责任链模式,实现命令族解析任务;结合模板方法模式,则可以减少Command子类的膨胀问题。
  • 命令模式的缺点
    在项目中如果对命令模式使用不慎,那么Command的子类可能会因为有N个命令,而扩展成N个,使得Command类变得非常庞大。

<?php
/**
 * 命令模式
 */
namespace pattern\command;

abstract class Group {
    abstract public function find();
    abstract public function add();
    abstract public function delete();
    abstract public function change();
    abstract public function plan();
}

final class CodeGroup extends Group {
    public function find() {
        echo 'find code group' . PHP_EOL;
    }
    public function add() {
        echo 'add requirement to code group' . PHP_EOL;
    }
    public function delete() {
        echo 'delete requirement to code group' . PHP_EOL;
    }
    public function change() {
        echo 'change requirement to code group' . PHP_EOL;
    }
    public function plan() {
        echo 'change plan to code group' . PHP_EOL;
    }
}
final class PageGroup extends Group {
    public function find() {
        echo 'find page group' . PHP_EOL;
    }
    public function add() {
        echo 'add requirement to page group' . PHP_EOL;
    }
    public function delete() {
        echo 'delete requirement to page group' . PHP_EOL;
    }
    public function change() {
        echo 'change requirement to page group' . PHP_EOL;
    }
    public function plan() {
        echo 'change plan to page group' . PHP_EOL;
    }
}

abstract class Command {
    protected $pagegroup = null;
    protected $codegroup = null;
    public function __construct() {
        $this->pagegroup = new PageGroup();
        $this->codegroup = new CodeGroup();
    }
    abstract public function execute();
}
final class AddRequirementToCodeGroup extends Command {
    public function execute() {
        $this->codegroup->find();
        $this->codegroup->add();
    }
}
final class ChangeRequirementToPageGroup extends Command {
    public function execute() {
        $this->pagegroup->find();
        $this->pagegroup->change();
    }
}

class Invoker {
    public function action(Command $command) {
        $command->execute();
    }
}

$add = new AddRequirementToCodeGroup();
$change = new ChangeRequirementToPageGroup();
$invoker = new Invoker();
$invoker->action($add);
$invoker->action($change);

输出结果:
find code group
add requirement to code group
find page group
change requirement to page group

以上内容摘自《设计模式之禅》

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值