命令模式和php实现

命令模式:
  命令模式(Command Pattern):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。

模式动机:
  在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活。
命令模式可以对发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。这就是命令模式的模式动机。

命令模式包含如下角色:
  Command: 抽象命令类
  ConcreteCommand: 具体命令类
  Invoker: 调用者
  Receiver: 接收者
  Client:客户类

UML类图:

  

//代码实现:

<?php
header("Content-type:text/html;Charset=utf-8");
//命令接口,定义具体命令接口要实现的执行函数
interface Command{
    function execute();
}
//具体命令角色AttackCommand,指定接受者执行攻击命令
class AttackCommand implements Command{
    private $receiver;
    function __construct(Receiver $receiver){
        $this->receiver = $receiver;
    }
    function execute(){
        $this->receiver->attackAction();
    }
}
//具体命令角色DefenseCommand,指定接受者执行防御命令
class DefenseCommand implements Command{
    private $receiver;
    function __construct(Receiver $receiver){
        $this->receiver = $receiver;
    }
    function execute(){
        $this->receiver->defenseAction();
    }
}
//接受者,执行具体命令角色的命令
class Receiver{
    private $name;
    function __construct($name){
        $this->name = $name;
    }
    function attackAction(){
        echo $this->name."执行了攻击命令";
    }
    function defenseAction(){
        echo $this->name."执行了防御命令";
    }
}
//请求者,请求具体命令的执行
class Invoker{
    private $concreteCommand;
    function __construct($concreteCommand){
        $this->concreteCommand = $concreteCommand;
    }
    function executeCommand(){
        $this->concreteCommand->execute();
    }
}

//客户端角色
class Client{
    function __construct(){
        $receiverZhao = new Receiver("赵日天");
        $attackCommand = new AttackCommand($receiverZhao);
        $attackInvoker = new Invoker($attackCommand);
        $attackInvoker->executeCommand();

        $receiverYe = new Receiver("叶良辰");
        $defenseCommand = new DefenseCommand($receiverYe);
        $defenseInvoker = new Invoker($defenseCommand);
        $defenseInvoker->executeCommand();
    }
}

//测试:
new Client();

模式分析:
  命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。
  每一个命令都是一个操作:请求的一方发出请求,要求执行一个操作;接收的一方收到请求,并执行操作。
  命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。
  命令模式使请求本身成为一个对象,这个对象和其他对象一样可以被存储和传递。
  命令模式的关键在于引入了抽象命令接口,且发送者针对抽象命令接口编程,只有实现了抽象命令接口的具体命令才能与接收者相关联。

适用性:
  抽象出待执行的动作以参数化某对象,你可用过程语言中的回调(call back)函数表达这种参数化机制。所谓回调函数是指函数先在某处注册,而它将在稍后某个需要的时候被调用。Command 模式是回调机制的一个面向对象的替代品。
  在不同的时刻指定、排列和执行请求。一个Command对象可以有一个与初始请求无关的生存期。如果一个请求的接收者可用一种与地址空间无关的方式表达,那么就可将负责该请求的命令对象传送给另一个不同的进程并在那儿实现该请求。
  支持取消操作。Command的Excute 操作可在实施操作前将状态存储起来,在取消操作时这个状态用来消除该操作的影响。Command 接口必须添加一个Unexecute操作,该操作取消上一次Execute调用的效果。执行的命令被存储在一个历史列表中。可通过向后和向前遍历这一列表并分别调用Unexecute和Execute来实现重数不限的“取消”和“重做”。
  支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍。在Command接口中添加装载操作和存储操作,可以用来保持变动的一个一致的修改日志。从崩溃中恢复的过程包括从磁盘中重新读入记录下来的命令并用Execute操作重新执行它们。
用构建在原语操作上的高层操作构造一个系统。这样一种结构在支持事务( transaction)的信息系统中很常见。一个事务封装了对数据的一组变动。Command模式提供了对事务进行建模的方法。Command有一个公共的接口,使得你可以用同一种方式调用所有的事务。同时使用该模式也易于添加新事务以扩展系统。

时间: 2024-10-11 06:46:00

命令模式和php实现的相关文章

5.5 进入编辑模式 5.6 vim命令模式 5.7 vim实践

5.5 进入编辑模式 5.6 vim命令模式 5.7 vim实践 扩展 vim的特殊用法 http://www.apelearn.com/bbs/thread-9334-1-1.html vim常用快捷键总结 http://www.apelearn.com/bbs/thread-407-1-1.html vim快速删除一段字符 http://www.apelearn.com/bbs/thread-842-1-1.html vim乱码 http://www.apelearn.com/bbs/thr

Ubuntu命令模式基础

Ubuntu是一个自由.开源.基于Debian的Linux发行版.在ubuntu的基础上,又衍生其它各具特色的Linux发行版.首先是一个操作系统,操作系统用于管理电脑硬件.要发挥出电脑的作用,还得依靠安装各种应用软件. 其相关的简单命令如下: (1)查看当前文件夹下的目录 ①.ls (list的缩写)命令用于列出文件和目录.默认上,他会列出当前目录的内容.带上参数后,可以以不同的方式显示.如图: ls命令可以列出当前目录的内容.dir命令是ls命令的一个别名,也是directory的缩写.通常

【游戏设计模式】之二 实现撤消重做、回放系统的神器:命令模式

本系列文章由@浅墨_毛星云 出品,转载请注明出处.   文章链接:http://blog.csdn.net/poem_qianmo/article/details/52663057 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 这篇文章将与大家一起探索游戏开发中命令模式的用法. 命令模式的成名应用是实现诸如撤消,重做,回放,时间倒流之类的功能.如果你想知道<Dota2>中的观战系统.<魔兽争霸3>中的录像系统.<守望先锋>

命令模式

1.命令模式:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化:对请求排列或记录请求日志,以及支持可以撤销的操作. 2.优点:(1).他能比较容易的设计一个命令队列:(2).在需要的情况下,比较容易的将命令记入日志:(3).允许接收请求的一方决定是否否决请求:(4).可以容易地实现对请求的撤销和重做:(5).由于加进新的具体命令类不影响其它类,因此增加新的具体命令很容易.(6).把请求一个操作的对象与指导怎么执行操作对象分隔开. 3.注意:不要为代码添加基于猜测的.实际不需要的

【设计模式】 模式PK:命令模式VS策略模式

1.概述 命令模式和策略模式的类图确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的意图是封装算法,它认为"算法"已经是一个完整的.不可拆分的原子业务(注意这里是原子业务,而不是原子对象),即其意图是让这些算法独立,并且可以相互替换,让行为的变化独立于拥有行为的客户:而命令模式则是对动作的解耦,把一个动作的执行分为执行对象(接收者角色).执行行为(命令角色),让两者相互独立而不相互影响. 我们从一个相同的业务需

设计模式—命令模式

1 概述 将一个请求封装为一个对象(即我们创建的Command对象),从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. 2 解决的问题 在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录.撤销或重做.事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适. 3 模式中的角色 3.1 抽象命令(Command):定义命令的接口,声明执行的方法. 3.2 具体命令(ConcreteCommand):具体命令,实现要执

javascript设计模式详解之命令模式

每种设计模式的出现都是为了弥补语言在某方面的不足,解决特定环境下的问题.思想是相通的.只不过不同的设计语言有其特定的实现.对javascript这种动态语言来说,弱类型的特性,与生俱来的多态性,导致某些设计模式不自觉的我们都在使用.只不过没有对应起来罢了.本文就力求以精简的语言去介绍下设计模式这个高大上的概念.相信会在看完某个设计模式之后有原来如此的感慨. 一.基本概念与使用场景: 基本概念: 将请求封装成对象,分离命令接受者和发起者之间的耦合. 命令执行之前在执行对象中传入接受者.主要目的相互

设计模式完结(14)-- 命令模式 --- 请求发送者与接收者解耦

起连接作用:  类似开关   和  电器  之间的   电线 请求发送者与接收者解耦,  引入命令类 abstract class Command { public abstract void execute(); } class Invoker { private Command command; //构造注入 public Invoker(Command command) { this.command = command; } //设值注入 public void setCommand(Co

命令模式(Command Pattern)

命令模式:将“请求”封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作. 模式类图: 下面举一个具体的例子: 有一个遥控器类RemoteControl,它可以控制Light类的行为,一个Command命令接口,两个实现Command接口的具体命令,分别实现开灯.关灯命令. 客户Client在使用这个遥控器的时候,先实例化一个RemoteControl类,如果它要开灯,那么就实例化LightOnCommand具体命令,将要控制的Light对象传入,调用setC

设计模式 之 命令模式

命令模式强调的是“封装调用”,即把方法调用封装起来.通过封装方法调用,我们可以把运算块封装成型,所以调用该运算的对象不需要关心事情是如何运行的,他们只需要知道如何使用包装成型的方法来完成它就可以了.通过封装方法调用,我们也可以做一些很聪明的事情,比如记录日志,或者重复使用这些封装来实现撤销. 我们通过下面这个例子 来了解命令模式:我们要设计一个家电自动化遥控器,这个遥控器具有多个可编程的插槽(每个插槽可以指定到一个不同的家电设备),每个插槽都对应一对开关按钮,整个遥控器还具备一个整体的撤销按钮,