继续设计模式心得体验——命令模式。

命令模式: 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

一般在命令模式中有三个元素,invoker、command、receive。command 是一个抽象类或者也可以是个接口,它封装了一个execute方法,一般在command初始化的时候接受一个receive参数,而execute就是执行该receive的某些方法。invoker是请求者,它自身可以存储一个或者一组command的子类,然后在某种情况下按顺序执行这些command的execute方法。当然你也就可以记录下这些命令,或者撤销。invoker就不需要知道receive怎么做的它只需要知道command有execute方法就行了,不管它是怎么做的,这样就和receive解耦了。

在生活中的命令模式很多,比如你去餐馆吃饭,服务员给你拿了菜单,你写下几个菜,服务员将你点的菜记下来,然后交给厨师去做,在这其中,服务员就扮演invoker的角色,他不需要知道厨师怎么烧菜的,他只要将订单(command组)交给厨师就好。

命令模式一般被用来解决类似队列,记录日志,有撤销操作等类型的问题,invoker是这个核心,它能保证命令的有序执行并且可以记录下他们或者撤销操作,而不需要管这些命令是什么,只要是继承了command命令就行。

从这个模式中我学到了,封装的好处和抽象(或者说接口),用抽象或者接口定义的execute保证了invoker每次调用command的子类时execute都不会出错,所以invoker可以保证队列,日志的正常运行或撤销,而封装好了的execute方法让invoker与具体实现解耦,不用管到底它是怎么实现的。

下面贴下该模式的代码:

代码

<?php
//抽象命令类
abstract class Command {
protected $_r;

public function __construct(Receiver $r)
{
$this->_r = $r;
}

abstract public function execute();
}

//接受命令者(真正的执行者)
class Receiver {
private $_name;

//这里初始化不同的接受者
function __construct($name)
{
$this->_name = $name;
}

function kaoyrc()
{
echo $this->_name . '在烤羊肉串<br />';
}

function kaojc()
{
echo $this->_name . '在烤鸡翅<br />';
}
}

class Invoker {
private $_commands = array();

function setCommand(Command $cmd)
{
$this->_commands[] = $cmd;
}

function execute()
{
foreach ($this->_commands as $cmd)
{
$cmd->execute();
}
}
}

//这个是烤羊肉串的命令
class kaoyrcCommand extends Command {
public function execute()
{
$this->_r->kaoyrc();
}
}
//这个是考鸡翅的命令
class kaojcCommand extends Command {
public function execute()
{
$this->_r->kaojc();
}
}

$zs = new Receiver('张三'); //初始化接受者张三
$ls = new Receiver('李四'); //初始化接受者李四

$waiter = new Invoker(); //创建服务员

$zskaoyrc = new kaoyrcCommand($zs); //创建让张三烤羊肉串的命令
$zskaojc = new kaojcCommand($zs); //创建让张三烤鸡翅的命令
$lskaojc = new kaojcCommand($ls); //创建让李四烤鸡翅的命令

//将命令报给服务员让他处理
$waiter->setCommand($zskaoyrc);
$waiter->setCommand($zskaojc);
$waiter->setCommand($lskaojc);

$waiter->execute(); //将命令组报给接受者(解决者)

?>

// 结果
// 张三在烤羊肉串
// 张三在烤鸡翅
// 李四在烤鸡翅

转载于:https://www.cnblogs.com/cl51287/archive/2010/10/14/1851703.html

设计模式心得:三——命令模式相关推荐

  1. 【白话设计模式八】命令模式(Command)

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factory) [白话设计模式二] ...

  2. Head First 设计模式中的命令模式 的一个错误

    最近在看Head First 设计模式,其中命令模式中有讲到实现撤销功能,并且作者还出了一道题, 下面的是书中习题: public class MarcoCommand implements Comm ...

  3. Head First 设计模式总结(六) 命令模式

    本文总结了<Head First 设计模式>中的命令模式 命令模式--将请求封装成"对象",以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持撤销操作. ...

  4. 【源码分析设计模式 13】命令模式

    一.基本介绍 1.在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作时哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计 ...

  5. 设计模式笔记:命令模式

    首先看看命令模式的定义:命令模式将请求封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持撤销的操作. 所谓参数化,我的理解是实际执行的对象,比如light(电灯).strer ...

  6. Java描述设计模式(20):命令模式

    本文源码:GitHub·点这里 || GitEE·点这里 一.生活场景 1.场景描述 智能电脑的品牌越来越多,由此诞生了一款电脑控制的APP,万能遥控器,用户在使用遥控器的时候,可以切换为自家电视的品 ...

  7. [设计模式-行为型]命令模式(Command)

    一句话 命令的请求和命令的执行用不同的对象表示.(好处是可以独立开发,也可以进行撤销) 概括 解析 COMMAND-俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,她对我有 ...

  8. 《设计模式》之命令模式

    一.命令模式定义 命令大家都不会陌生,那么在开始命令模式之前,可以想象一下生活中的命令模式的特点: 如老板命令你完成一个OA项目是一个命令,接着看看其特点: 1.在上面的命令中,命令的执行者肯定是聪明 ...

  9. 设计模式之禅-命令模式

    目录 命令模式 例子 定义 优点 缺点 使用场景 扩展 增加需求 回滚 完美的Command 命令模式 例子 外包甲方项目..刚开始,客户(也就是旅行社,甲方)很乐意和我们每个组探讨,比如和需求组讨论 ...

最新文章

  1. 在Rust代码中编写Python是种怎样的体验?
  2. 迁移学习之VGG16和VGG19
  3. 【FFmpeg】FFmpeg 相关术语简介 ( 容器 | 媒体流 | 数据帧 | 数据包 | 编解码器 | 复用 | 解复用 )
  4. PostgreSQL入门篇学习笔记(七)
  5. 红帽JBoss BRMS和BPMS富客户端框架展示了与GWT / Errai / UberFire和AngularJS的多语言集成...
  6. LeetCode 697. 数组的度
  7. MongoDB (六) MongoDB 集合操作
  8. python做excel自动化-用Python控制Excel实现自动化办公,手把手教你
  9. Codeforces Round #666 (Div. 2)D. Stoned Game(博弈问题)
  10. 怎么寻找java实例,Java 实例 – 在指定目录中查找文件
  11. 地理空间数据云下载遥感影像
  12. 安卓改机,改串的研究
  13. SRGAN-超分辨率图像复原
  14. 天刀霸王枪服务器怎么维护了,霸王枪27日合服 11批天涯合服维护公告
  15. 全网最详细!vue中使用flv.js 播放直播监控视频流
  16. 天猫魔盒部分adb shell或telnet下有用命令
  17. Android实践:做一个可视频交互的智能小车
  18. 怎样分析数据致提高产出?(三)
  19. JavaScript 数组塌陷
  20. K8s工作负载原理剖析和体验-杜军-专题视频课程

热门文章

  1. Django学习笔记《一》图书管理系统项目挂载到阿里云
  2. 守护进程nohup的用法
  3. mysql 学习笔记03 常用数据类型
  4. 框架controller找不到_SpingBoot框架知识详解
  5. 比较ArrayList和数组的区别
  6. 1007. 素数对猜想
  7. RocketMQ消费者是如何获取消息的?转疯了!
  8. 成功跳槽百度工资从15K涨到28K,跳槽薪资翻倍
  9. 翻译(九)——Clustered Indexes: Stairway to SQL Server Indexes Level 3
  10. 在windows storage server 2008上创建iscsi磁盘