以前做对外做项目的时候,部门大致分为需求组,美工组,代码组,客户找到需求人员讨论需求,找到美工人员讨论页面,找到代码人员讨论功能。
<?php abstract class Group { public abstract function find(); public abstract function add(); public abstract function delete(); public abstract function change(); public abstract function plan(); } class RequirementGroup extends Group{ public function find() { echo "找到需求组\n"; } public function add() { echo "客户要求增加一个需求\n"; } public function delete() { echo "客户要求取消一个需求\n"; } public function change() { echo "客户要求改变一个需求\n"; } public function plan() { echo "客户要求需求变更计划\n"; } } class PageGroup extends Group{ public function find() { echo "找到美工组\n"; } public function add() { echo "客户要求增加一个页面\n"; } public function delete() { echo "客户要求取消一个页面\n"; } public function change() { echo "客户要求改变一个页面\n"; } public function plan() { echo "客户要求页面变更计划\n"; } } $rg = new RequirementGroup(); $rg->find(); $rg->add(); $rg->plan(); ?> 运行结果: 找到需求组 客户要求增加一个需求 客户要求需求变更计划
感觉良好啊,但如果你是客户你每次都要先找到人,再告诉他该怎么做,再确定他的方案,你是不是会觉得你的钱花的不值。客户就只想我要这么做,其它的他都不管,你给我实现就行。这就像是下达命令。那让我们用命令模式来重构一下,类图如下:
创建一个Invoker类,相当于项目负责人的角色,客户直接与Invoker交涉,由Invoker再根据项目的情况下达所需的命令,将经常重复的命令封装以加快效率。在原有的代码基础再加上如下代码:
class CodeGroup extends Group{ public function find() { echo "找到代码组\n"; } public function add() { echo "客户要求增加一个功能\n"; } public function delete() { echo "客户要求取消一个功能\n"; } public function change() { echo "客户要求改变一个功能\n"; } public function plan() { echo "客户要求功能变更计划\n"; } } abstract class Command { protected $rg = null; protected $pg = null; protected $cg = null; public function __construct() { $this->rg = new RequirementGroup(); $this->pg = new PageGroup(); $this->cg = new CodeGroup(); } abstract public function execute(); } class AddRequirementCommand extends Command{ public function execute() { $this->rg->find(); $this->rg->add(); $this->rg->plan(); } } class DeleteRequirementCommand extends Command{ public function execute() { $this->rg->find(); $this->rg->delete(); $this->rg->plan(); } } class Invoker { private $command; public function setCommand( $command ) { $this->command = $command; } public function action() { $this->command->execute(); } } $invoker = new Invoker(); $addRequirementCommand = new AddRequirementCommand(); $invoker->setCommand($addRequirementCommand); $invoker->action(); $deleteRequirementCommand = new DeleteRequirementCommand(); $invoker->setCommand($deleteRequirementCommand); $invoker->action(); 运行结果: 找到需求组 客户要求增加一个需求 客户要求需求变更计划 找到需求组 客户要求取消一个需求 客户要求需求变更计划 [Finished in 0.2s]
命令模式的定义
高内聚的模式,将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。命令模式有三种角色构成:
1、Receive接收者角色
该角色就是干活的角色,命令传递到这里是应该被执行的,具体到我们上面的例子中就是Group的三个实现类。
2、Command命令角色
需要执行的所有命令都在这里声明
3、Invoker调用者角色
接收到命令,并执行命令。
命令模式的优点
1、类间解耦
调用者角色与接收者角色之间没有任何依赖关系,调用者实现功能时只须调用Command抽象类的execute以夷伐夷可以,不需要了解到底哪个接收者执行。
2、可扩展性
Command的子类可以非常容易地扩展,而调用者Invoker和高层次的模块Client不产生严重的代码耦合。
3、命令模式结合其他模式会更优秀
命令模式可以结合责任链模式,实现命令族解析任务;结合模式方法模式,则可以减少Command子类的膨胀问题。
命令模式的缺点
请看Command的子类,如果有N个命令,问题就出来了。Command的子类就可不是几个,而是N个.这个类膨胀得非常大,这个就需要读者在项目中慎重考虑使用。
命令模式的扩展
客户需求的多样化
客户有个需求,它既需要增加一个页面,同时又要增加一个功能,想想,如果是老方法,那么客户需要先后找三个组的人员,而用命令模式,只需更改一下添加需求命令类
class AddRequirementCommand extends Command{ public function execute() { $this->rg->find(); $this->rg->add(); $this->pg->add(); $this->cg->add(); $this->rg->plan(); } }
个人感觉命令模式如果独立存在确实对于php来说比较膨胀,但如果与模板模式结合使用,确实是相当不错的高内聚模式,写完之余,感觉此模式与之前的中介者模式有几分想象,但认真再回头看中介者模式之后,还是发现有很大的不同,大家可以看后作下对比。
相关推荐
命令模式(Command Pattern)是一种行为设计模式,它将请求封装为一个对象,使得你可以使用不同的请求、队列请求,或者支持可撤销的操作。在Java中实现命令模式,我们可以利用面向对象编程的特性来构建系统,使得...
在实际应用中,命令模式常常出现在图形用户界面的事件处理、事务管理、远程过程调用等场景。例如,GUI 中的按钮点击事件可以看作一个命令,按钮对象是调用者,事件处理器是接收者,而事件处理器的处理方法则是具体的...
### 命令模式(Command Pattern) #### 概述 命令模式是一种行为设计模式,它将请求封装成对象,以便使用不同的请求对客户端进行参数化。该模式有助于将发送请求的对象与执行请求的对象解耦。 #### 核心概念 在...
命令模式(Command Pattern)是一种行为型设计模式,它将请求封装为对象,从而使您可以使用不同的请求、队列请求或日志请求,并支持可撤销操作。命令模式通常用于实现操作的解耦,使得发送者和接收者之间不直接关联...
用最简单的例子理解命令模式(Command Pattern) 命令模式的需求源自想通过一个指令(比如这里IControl的Execute方法)来控制多个类的多个方法,包含了几个要素: 1、命令:让类的各种方法抽象成类实现一个接口 2、...
通过命令模式,我们可以轻松地添加新的命令,只需创建新的具体命令类并实现`Command`接口即可。此外,由于命令对象存储了接收者,所以可以很容易地在不同上下文中重用命令,甚至可以在命令执行后撤销操作(通过保存...
12、命令模式COMMAND PATTERN 13、装饰模式DECORATOR PATTERN 14、迭代器模式ITERATOR PATTERN 15、组合模式COMPOSITE PATTERN 16、观察者模式OBSERVER PATTERN 17、责任链模式 18、访问者模式VISITOR PATTERN ...
总结来说,"CommandPattern)管理智能家电最终代码共4页.pdf.zip"提供的示例应该展示了如何利用命令模式来管理和控制智能家电系统,包括命令的创建、执行、撤销以及如何将这些概念融入到实际的软件设计中。...
**命令模式(Command Pattern)详解** 命令模式是一种行为设计模式,它将请求封装为一个对象,使得你可以使用不同的请求、队列或者日志请求,也可以支持可撤销的操作。在C++中实现命令模式,可以有效地解耦调用者和...
**命令模式(Command Pattern)**是一种行为型设计模式,它将请求封装成对象,从而使你能够用不同的请求对客户端进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。在命令模式中,请求是以命令的形式...
**命令模式(Command Pattern)详解** 命令模式是一种行为设计模式,它将请求封装为一个对象,使得你可以使用不同的请求、队列或者日志请求,也可以支持可撤销的操作。在这个场景中,我们关注的是如何利用命令模式...
命令模式是一种设计模式,它将请求封装为一个对象,使得我们可以使用不同的请求、队列请求、或者记录请求日志,也可以支持可撤销的操作。在C#中,命令模式的应用可以帮助我们更好地解耦系统中的调用者和接收者,提高...
命令模式是一种行为设计模式,它将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。在软件工程中,这种模式常用于解耦发出命令的对象(调用者)与...
- `CommandPattern` 文件夹:可能包含了命令模式相关的类,如Command接口、ConcreteCommand类等。 - `Properties` 文件夹:存储项目的属性配置,如AssemblyInfo.cs,用于定义元数据。 在实际应用中,C#命令模式可能...
在提供的文件列表中,`Program.cs`通常是主程序入口,`TestPatternCommand.csproj`是项目文件,`CommandPattern`可能是包含命令模式相关类的文件夹,`Properties`包含了项目的配置信息,而`TestPatternCommand.sln`...
在软件系统中,“行为请求者”与“行为实现者”通常呈现一种...[GOF《设计模式》]Command模式结构图如下:图1Command模式结构图Command模式将一个请求封装为一个对象,从而使你可以使用不同的请求对客户进行参数化。
工厂方法模式(Factory Method Pattern) 观察者模式(Observer Pattern) 建造者模式(Builder Pattern) 解释器模式(Interpreter Pattern) 命令模式(Command Pattern) 模板方法模式(Template Method Pattern) 桥接模式...
在`CommandPattern.zip`文件中,可能包含了这个模式的示例代码,你可以进一步查看和学习这些代码,以便更好地理解和应用命令模式。记住,虽然这是一个简单的实现,但命令模式的威力在于其能够适应复杂的需求,例如在...
在命令模式中,调用者(Invoker)不再直接调用接收者(Receiver)的方法,而是通过一个命令对象(Command)作为中介。命令对象封装了对接收者的操作,实现了请求的接口。这样,当需要执行一个新的操作时,只需要创建...
命令模式(Command Pattern)是一种行为设计模式,它允许将请求封装为一个对象,从而使不同的请求可以使用不同的参数进行参数化,队列或日志请求,以及支持可撤销的操作。在 Java 中,命令模式的实现通常涉及一个...