Aexi(6)-Command模式

这两天我们给Aexi增加了Command模式。

其实我对于Command模式比较少的印象就是可以用来做撤销操作的功能,我看过的所有的书对于这个模式的介绍,都是把它和撤销操作相联系,似乎Command模式是专门为这一功能设计的.Command模式有没有其他的应用呢,我也不太知道,但是既然这里可以用到,那我们就在这里用一下.至于对这个模式更深层次的理解,那就等到遇到相应的问题的时候具体对待了,但是至少得有一个基本的印象才可以.

首先定义Command接口,代码如下:

	public interface Command {
              public boolean excute();

              public void unExcute();

              public boolean canUndo();
           }

所有的命令的子类都需要实现这个接口,其中excute()方法是当前命令对象的具体的业务代码.unExcute()方法是当前命令对象的反操作的代码,用于撤销当前操作.canUndo()方法返回一个布尔值用来确定当前命令对象是否是可以执行的撤销的操作.

下面再来看一个Command的管理类.代码如下:

public class CommandManager {
    private Command currentCommand;

    private List<Command> commands = new ArrayList<>();

    public void setCurrentCommand(Command currentCommand) {
        this.currentCommand = currentCommand;
    }

    public void excuteCommand() {
        if (currentCommand.excute() && currentCommand.canUndo())
            addToCommandList();
    }

    private void addToCommandList() {
        assert currentCommand.canUndo();
        commands.add(currentCommand);
    }

    private static CommandManager instance = new CommandManager();

    private CommandManager() {}

    public static CommandManager getInstance() {
        return instance;
    }
}

因为这个Commandmanager类全局范围中只允许出现一个,所以我将它写成了单例模式.

类中有两个字段currentCommand和commands。其中currentCommand是当前正在执行的命令.Commands是命令的一个列表,用于存储执行过的命令历史。下面是客户端调用的代码:

if (e.getKeyChar() == '\b') {
    command = new DeleteCommand(composition);
}else {
    command = new InsertCommand(composition,new Character(e.getKeyChar(),font));
}
commandManager.setCurrentCommand(command);
commandManager.excuteCommand();

主要有这么几步:

第一:创建对应的实现了接口的具体类

第二:获得CommandMannager对象,给CommandManager设置currentCommand。

第三:调用Commandmanager的excuteCommand方法.

这样的话就实现了Command模式.

时间: 2024-10-14 04:03:20

Aexi(6)-Command模式的相关文章

Command模式

在开发中,有时需要向对象发送请求,但是不知道请求的接受者是谁,被请求的操作是什么.这时可以使用command模式. Command模式将请求封装到一个对象(Command)中,并将请求的接受者存放到具体的ConcreteCommand类中的Receiveer中.这样实现了操作的对象和操作的具体实现之间的解耦. 实现 Receiver.h #ifndef _RECIEVER_H_ #define _RECIVEER_H_ class Reciever { public: Reciever(); ~

Java命令模式(Command模式)

Command模式是最让我疑惑的一个模式,我在阅读了很多代码后,才感觉隐约掌握其大概原理,我认为理解设计模式最主要是掌握起原理构造,这样才对自己实际编程有指导作用.Command模式实际上不是个很具体,规定很多的模式,正是这个灵活性,让人有些confuse. Command定义 不少Command模式的代码都是针对图形界面的,它实际就是菜单命令,我们在一个下拉菜单选择一个命令时,然后会执行一些动作. 将这些命令封装成在一个类中,然后用户(调用者)再对这个类进行操作,这就是Command模式,换句

Command模式(C++命令模式)

重新温习GOF23到第19个命令模式了,写下来方便自己理解 用经理,秘书,邮局来理解这个模式还是比较好的. 经理:喂,小丽呀,这儿有封信,请帮我尽快寄出去- 秘书:好的,经理,我马上去办! 秘书拿着这封信,到一家邮局将信寄了出去.邮局最终也将信投递到了收件人手中. 这是一个很常见的生活工作场景,不过这里面:经理.秘书和邮局,三者在不知不觉间,演绎了一出面向对象设计模式:Command模式.Command模式是我打算讲的第一个行为型设计模式. Command模式的内容大致如此: 将一个请求封装成一

Command模式详解--设计模式(18)

Memento模式来源:       Command模式通过将请求封装到一个对象(Command)中,并将请求的接受者存放到具体的ConcreteCommand类中(Receiver)中,从而实现调用操作的对象和操作的具体实现者之间的解耦. Memento模式作用: 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作.由于"行为请求者"与"行为实现者"的紧耦合,使用命令模式,可以对请求排队或记录请求日志,

Command 模式 Step by step

提起Command模式,我想没有什么比遥控器的例子更能说明问题了,本文将通过它来一步步实现GOF的Command模式. 我们先看下这个遥控器程序的需求:假如我们需要为家里的电器设计一个远程遥控器,通过这个控制器,我们可以控制电器(诸如灯.风扇.空调等)的开关.我们的控制器上有一系列的按钮,分别对应家中的某个电器,当我们在遥控器上按下"On"时,电器打开:当我们按下"Off"时,电器关闭. 好了,让我们开始Command 模式之旅吧. HardCoding的实现方式

【行为型】Command模式

命令模式是指将用户的请求封装成(命令)对象,从而可将用户不同的请求进行参数化.对这些请求排序或记录请求日志.以及支持回滚恢复操作.记得以前刚开始使用Photoshop时,就发现它的操作历史记录面板特别好用,现在想想,其实也可以通过命令模式来设计.命令模式主要是将请求抽象成对象,以此作为中间的一个中转站,转达请求命令,从而将请求方与响应方解耦.在逻辑层面上,用户只需要发布自己的命令即可,至于由什么样的响应者来处理,则需要看具体下达的是什么样的命令.模式类结构图参考如下: 模式编码结构参考如下: 1

敏捷软件开发(3)---COMMAND 模式 &amp; Active Object 模式

COMMAND 模式 command模式非常简单,简单到你无法想象的地方. public interface Command { void execute(); } 这就是一个command模式的样子.也许你会觉得,这有点多此一举吗.但是当你使用他的时候,command模式就会闪现光华. 这样一个场景:经理张三叫leader王二去开发一个项目, 王二就安排李四 去开发这个功能A. 李四何时执行,怎么执行就是他自己的事情了. UML图如上所示: 代码如下: public interface Com

Android学习按键事件监听与Command模式

Android学习按键事件监听与Command模式 - Dufresne - 博客园 ? 一 Command模式 意图: 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化: 对请求排队或记录请求日志,以及支持可撤销的操作. 将请求被封装成一个对象,当向某对象提交请求时,使我们可以不用去知道被具体的请求的操作或者请求的接收者, 实现了动作的请求者对象和动作的执行者对象之间的解耦合. 适用性: 使用Command模式代替callback形式的回调应用: 在不同的时刻指定.排列和执行请

Behavioral模式之Command模式

1.意图 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作. 2.别名 动作(Action),事务(Transaction) 3.动机 有时必须向某对象提出请求,当但并不知道关于被请求的操作或请求的接收者任何信息.例如,用户界面工具箱包括按钮和菜单这样的对象,它的执行请求响应用户输入.但工具箱不能显式的在按钮或菜单中实现该请求,因为只有使用工具箱的应用知道那该由哪个对象做哪个操作.而工具箱的设计者无法知道请求的请求者或执行的操作.