将一个请求封装成一个对象,从而可以用不同的请求对象对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作.

与状态模式和责任链模式的区别是,命令模式设定一次,统一执行

使用场景:
1.可设计一个队列
2.较容易将命令计入日志
3.允许接收的一方是决定是否否决请求
4.可以实现对请求的撤销和重做
5.加入新的命令类不影响其他的类.
6.把请求一个操作的对象与执行操作的对象分离开.

UML

示例代码:

// 命令接口
abstract class Command
{
protected $receiver; public function __construct(Receiver $receiver)
{
$this->receiver = $receiver;
}
// 执行命令
abstract public function execute($params);
// 撤销命令
abstract public function undo();
} // 具体命令执行者
class UserCommand extends Command
{
public function execute($params)
{
return $this->receiver->command($params);
} public function undo()
{
return $this->receiver->undo();
}
} // 具体命令执行者2
class EmailCommand extends Command
{
public function execute($params)
{
return $this->receiver->command($params);
} public function undo()
{
return $this->receiver->undo();
} } // 命令接受者接口
interface Receiver
{
public function command($params);
public function undo();
} // 命令接受者1
class User implements Receiver
{
public function command($parms)
{
echo '写入:用户增加成功' . $parms;
} public function undo()
{
echo '撤销了日志写入';
}
} // 命令接受者2
class Email implements Receiver
{
public function command($parms)
{
echo '发送邮件' . $parms;
} public function undo()
{
echo '撤销了发送邮件';
}
} // 命令请求者
class Invoker
{
protected $command; public function setCommand(Command $command)
{
$this->command = $command;
} public function execute($params)
{
return $this->command->execute($params);
} public function undo()
{
return $this->command->undo();
}
} $receiver1 = new User();
$receiver2 = new Email(); $invoker = new Invoker();
$invoker->setCommand(new UserCommand($receiver1));
$invoker->execute('jack');
$invoker->undo(); $invoker->setCommand(new EmailCommand($receiver2));
$invoker->execute('jack');
$invoker->undo();

 

另一个例子:

客户点菜,服务员向厨师发送炒菜命令

/**
* 厨师,命令接受者与执行者
* Class Cook
*/
class Cook
{
public function chaocai()
{
echo '开始炒菜了';
} public function zuotang()
{
echo '开始做汤';
}
} // 命令接口
abstract class Command
{
protected $cook; public function __construct(Cook $cook)
{
$this->cook = $cook;
}
} // 命令1
class Chaocai extends Command
{
public function chaocaiCommand()
{
$this->cook->chaocai();
}
} // 命令2
class Zuotang extends Command
{
public function zuotangCommand()
{
$this->cook->zuotang();
}
} // 命令请求者,服务员
class Fuyuwuan
{
private $chaocai;
private $zuotang; public function __construct(Chaocai $chaocai, Zuotang $zuotang)
{
$this->chaocai = $chaocai;
$this->zuotang = $zuotang;
} public function callChaocai()
{
$this->chaocai->chaocaiCommand();
} public function callZuotang()
{
$this->zuotang->zuotangCommand();
}
} // 客户
$cook = new Cook(); // 新建厨师
// 命令
$chaocai = new Chaocai($cook);
$zuotang = new Zuotang($cook); $fuwuyuan = new Fuyuwuan($chaocai, $zuotang); // 新建服务员
$fuwuyuan->callChaocai(); // 向服务员点单

  

 

B6:命令模式 Command的更多相关文章

  1. 设计模式 - 命令模式(command pattern) 多命令 具体解释

    命令模式(command pattern) 多命令 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.ne ...

  2. 设计模式 - 命令模式(command pattern) 具体解释

    命令模式(command pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 命令模式(command pattern) : 将请求封装成对 ...

  3. 设计模式 ( 十三 ) 命令模式Command(对象行为型)

    设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述         在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需 ...

  4. 设计模式 - 命令模式(command pattern) 宏命令(macro command) 具体解释

    命令模式(command pattern) 宏命令(macro command) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考: 命名模式(撤销) ...

  5. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

  6. 命令模式 Command 行为型 设计模式(十八)

    命令模式(Command) 请分析上图中这条命令的涉及到的角色以及执行过程,一种可能的理解方式是这样子的: 涉及角色为:大狗子和大狗子他妈 过程为:大狗子他妈角色 调用 大狗子的“回家吃饭”方法 引子 ...

  7. Java 设计模式系列(十四)命令模式(Command)

    Java 设计模式系列(十四)命令模式(Command) 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复 ...

  8. 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释

    命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ...

  9. 二十四种设计模式:命令模式(Command Pattern)

    命令模式(Command Pattern) 介绍将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作. 示例有一个Message实体类,某个 ...

随机推荐

  1. 《JAVA8实战》读书笔记之传递方法和传递lambda

    传递方法: 假设 你有一个Apple类,它 有一个getColor方法,还有一个变量inventory保存着一个Apples的列表.你可能想要选出所 有的绿苹果,并返回一个列表.通常我们用筛选(fil ...

  2. Centos 7.3 安装 Mongodb

    通过yum 安装: yum install -y mongodb-server Mongodb操作命令: #启动 systemctl start mongod.service #关闭 systemct ...

  3. 使用厂商MIB库查找设备OID值 并实施监控的方法

    http://chuansong.me/n/2700132 https://wenku.baidu.com/view/eeaeb1d680eb6294dd886cc7.html

  4. AC日记——绿豆蛙的归宿 codevs 2488

    绿豆蛙的归宿 思路: topsort+期望dp: 代码: #include <cstdio> #include <cstring> #include <iostream& ...

  5. javascript面试题(一)(转载)

    1,判断字符串是否是这样组成的,第一个必须是字母,后面可以是字母.数字.下划线,总长度为5-20 var reg = /^[a-zA-Z][a-zA-Z_0-9]{4,19}$/; /*注意:1.要用 ...

  6. CvScalar

    CvScalar定义可存放1—4个数值的数值,其结构如下. typedef struct CvScalar{    double val[4];}CvScalar; ----------------- ...

  7. CodeVS 1226 倒水问题【DFS/BFS】

    题目描述 Description 有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x,y 为整数且均不大于 100 )的水.设另有一水 缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水 ...

  8. UVA 12594 Naming Babies

    $dp$,斜率优化. 设$dp[j][i]$表示前$i$个位置分成$j$段的最小值,递推式很好写,预处理几个前缀和就可以了,然后斜率优化即可. #pragma comment(linker, &quo ...

  9. [BZOJ 2768] 冠军调查

    Link:https://www.lydsy.com/JudgeOnline/problem.php?id=2768 Solution: 一道比较基础的最大流的题目 一般看到将点分为两类的题目就要往网 ...

  10. 【DFS序】【莫队算法】【权值分块】bzoj2809 [Apio2012]dispatching

    题意:在树中找到一个点i,并且找到这个点子树中的一些点组成一个集合,使得集合中的所有点的c之和不超过M,且Li*集合中元素个数和最大 首先,我们将树处理出dfs序,将子树询问转化成区间询问. 然后我们 ...