命令(Command)模式:又称Action模式或者Transaction模式。它属于对象的行为模式。命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和撤销功能。
GoF命令模式结构图如下:
命令模式是有以下角色:
抽象命令(Command)角色:声明执行操作的接口。
具体命令(ConcreteCommand)角色:将一个接收者对象绑定到一个动作上。调用接收者相应的操作,以实现Execute方法。
客户端(Client)角色:创建一个命令对象并设定它的接收者。
请求者(Invoker)角色:负责调用命令对象的执行请求;
接收者(Receiver)角色:负责具体实施和执行一个请求相关的操作。任何一个类都可以作为一个接收者。
上面模型的模拟代码如下:
- package command;
- /**
- *
- *作者:alaric
- *时间:2013-8-20下午7:39:48
- *描述:接收者角色
- */
- public class Receiver {
- public Receiver() {
- super();
- }
- /**
- *
- *作者:alaric
- *时间:2013-8-20下午7:40:00
- *描述:行动方法
- */
- public void action(){
- System.out.println("接收者接到命令,开始行动");
- }
- }
- package command;
- /**
- *
- *作者:alaric
- *时间:2013-8-20下午7:36:51
- *描述:抽象命令角色
- */
- public interface Command {
- /**
- *
- *作者:alaric
- *时间:2013-8-20下午7:36:40
- *描述:执行方法
- */
- public void execute();
- }
- package command;
- /**
- *
- *作者:alaric
- *时间:2013-8-20下午7:37:10
- *描述:具体命令角色
- */
- public class ConcreteCommand implements Command {
- private Receiver receiver;
- public ConcreteCommand(Receiver receiver) {
- super();
- this.receiver = receiver;
- }
- @Override
- public void execute() {
- receiver.action();
- }
- }
- package command;
- /**
- *
- *作者:alaric
- *时间:2013-8-20下午7:41:07
- *描述:
- */
- public class Invoker {
- private Command command;
- public Invoker(Command command) {
- super();
- this.command = command;
- }
- public void action(){
- command.execute();
- }
- }
- package command;
- /**
- *
- *作者:alaric
- *时间:2013-8-20下午7:33:51
- *描述:客户端角色
- */
- public class Client {
- /**
- *作者:alaric
- *时间:2013-8-20下午7:33:44
- *描述:
- */
- public static void main(String[] args) {
- Receiver receiver = new Receiver();
- Command command = new ConcreteCommand(receiver);
- Invoker invoker = new Invoker(command);
- invoker.action();
- }
- }
1、命令模式使新的命令在不改变现有结构代码的情况下很容易被加入到系统里;
2、允许接收请求的一方决定是否否决请求;
3、能较容易地设计一个命令队列;
4、可以容易地实现对请求的Undo和Redo操作;
5、在需要的情况下以较容易地将命令记入日志。
在讲门面模式的时候曾经提过一个例子,我们小时玩过投币的那种游戏机,一个方向操作杆,四个动作按钮,在一个操作面板上,封装了复杂的逻辑在机器内部,提供简单的操作界面,是一个门面的例子,然而每个操作发出一个命令,来控制游戏人物的运动和各种动作。方向操作杆是一个移动的命令,传入移动的方向和距离作为参数,还有出拳按键发出出拳命令,脚踢按键发出脚踢的命令,那还有组合操作命令,比如下踢腿(操作杆向下和踢脚按钮按下)。现在我们用命令模式来模拟这个场景。类的模型图如下:
如上图所示:Client相当于小时候的我们,Control相关于控制执行器,我们可以控制踢(KickCommand)、打(FistCommand)、移动(MoveCommand),这些命令的最终实现者也是接收者是游戏机(GameMachine)。
代码如下:
- package command.example;
- /**
- *
- *作者:alaric
- *时间:2013-8-21上午7:15:53
- *描述:接收者
- */
- public class GameMachine {
- public void fist() {
- System.out.println("出拳");
- }
- public void kick() {
- System.out.println("出脚");
- }
- public void move(String direction){
- System.out.println("向"+direction+"移动");
- }
- }
- package command.example;
- /**
- *
- *作者:alaric
- *时间:2013-8-20下午10:20:35
- *描述:命令接口
- */
- public interface Command {
- //执行方法
- public void execute();
- //这里还可以加入撤销方法,回滚方法等
- }
- package command.example;
- /**
- *
- *作者:alaric
- *时间:2013-8-21上午7:17:02
- *描述:拳打
- */
- public class FistCommand implements Command {
- private GameMachine machine;
- public FistCommand(GameMachine machine) {
- super();
- this.machine = machine;
- }
- @Override
- public void execute() {
- machine.fist();
- }
- }
- package command.example;
- /**
- *
- *作者:alaric
- *时间:2013-8-21上午7:42:21
- *描述:脚踢命令
- */
- public class KickCommand implements Command {
- private GameMachine machine;
- public KickCommand(GameMachine machine) {
- super();
- this.machine = machine;
- }
- @Override
- public void execute() {
- machine.kick();
- }
- }
- package command.example;
- /**
- *
- *作者:alaric
- *时间:2013-8-21上午7:17:02
- *描述:移动命令
- */
- public class MoveCommand implements Command {
- private GameMachine machine;
- private String direction;
- public MoveCommand(GameMachine machine,String direction) {
- super();
- this.machine = machine;
- this.direction = direction;
- }
- @Override
- public void execute() {
- machine.move(direction);
- }
- }
- package command.example;
- /**
- *
- *作者:alaric
- *时间:2013-8-21上午7:43:14
- *描述:控制类
- */
- public class Control {
- private Command fistCommand;
- private Command kickCommand;
- private Command moveCommand;
- public Control(Command fistCommand, Command kickCommand, Command moveCommand) {
- super();
- this.fistCommand = fistCommand;
- this.kickCommand = kickCommand;
- this.moveCommand = moveCommand;
- }
- public void fist(){
- fistCommand.execute();
- }
- public void kick(){
- kickCommand.execute();
- }
- public void move(){
- moveCommand.execute();
- }
- }
- package command.example;
- /**
- *
- *作者:alaric
- *时间:2013-8-20下午9:26:42
- *描述:客户端角色
- */
- public class Client {
- /**
- *作者:alaric
- *时间:2013-8-20下午9:26:36
- *描述:测试
- */
- public static void main(String[] args) {
- GameMachine machine = new GameMachine();
- Command fistCommand = new FistCommand(machine);
- Command kickCommand = new KickCommand(machine);
- Command moveCommand = new MoveCommand(machine, "左");
- Control control = new Control(fistCommand, kickCommand, moveCommand);
- control.fist();
- control.kick();
- control.move();
- //其实在不同命令模式的情况下就是下面这样直接调用,
- //就会让调用者和实际命令执行者紧紧耦合在一起,还有一个好处
- //就是可以在
- //machine.fist();
- //machine.kick();
- //machine.move("左");
- }
- }
运行结果如下:
出拳
出脚
向左移动
通过上面代码可以看出,本来客户端可以直接调用接收者来执行动作的,现在在中间引入了命令,这些命令由调用者(Invoker这里是Control)来调用,从而对客户端和命令接收者解耦了,增加了命令后,使得命令除了execute方法外,可以插入很多其它动作,比如redo,undo,或者记录日志等。
相关推荐
命令Command模式是GOF23种模式中的一种,是一种行为模式。这种模式很难理解。《设计模式》一书中对它语焉不详。而网上的一些文章对其的解释也是错误的。实际上,命令模式并不是那么神秘。 命令模式的理解,关键有2点...
Command设计模式ppt 代码示例 设计模式 Command ppt 代码实例 撤销重做实例
C#面向对象设计模式纵横谈(15):(行为型模式) Command 命令模式
有关设计模式里边的命令模式,内含ppt、源代码及结果、word整理。在此以供大家学习交流。
设计模式C++学习之命令模式(Command)
命令模式(Command) 用意:把一个请求封装到一个对象中,把发出命令和执行命令的责任分开,委派给不同的对象实现。
用java实现命令模式。展现命令模式类与类之间的继承,依赖关系。
命令模式
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
C++设计模式代码资源23_Command_命令模式.zip
命令模式是一种行为设计模式,它将一个请求封装成一个对象,从而允许用户根据不同的请求对客户进行参数化;同时,它也支持撤销操作。 命令模式的核心在于通过命令对象实现调用操作和实现操作的解耦。这种模式通常...
Head First 设计模式 (六) 命令模式(Command pattern) C++实现
命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
Command命令模式是一种对象行为型模式,它主要解决的问题是:在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”的问题
命令模式Command将请求封装成对象,以便使用不同的请求、队列、或者日志来参数化其他对象。命令模式也支持可撤销的操作。
C++设计模式课件23_Command_命令模式.pdf
用最简单的例子理解命令模式(Command Pattern) 命令模式的需求源自想通过一个指令(比如这里IControl的Execute方法)来控制多个类的多个方法,包含了几个要素: 1、命令:让类的各种方法抽象成类实现一个接口 2、...
Command(命令)模式[定义].pdf
主要介绍了Java设计模式之命令模式(Command模式)介绍,本文讲解了Command模式的定义、如何使用命令模式等内容,需要的朋友可以参考下