设计模式学习(二十一):命令模式

设计模式,学习,二十一,命令,模式 · 浏览次数 : 34

小编点评

**设计模式学习(二十一):命令模式** **什么是命令模式?** 命令模式是一种行为型模式,通过调用者调用接受者执行命令,执行顺序是:调用者→命令→接受者。 **命令模式的优点:** * **可扩展性:**可以处理多种类型的命令。 * **可维护性:**命令可以被分解并缓存,提高效率。 * **可重用性:**可以从不同的命令中提取通用逻辑。 **命令模式的应用场景:** * **事务处理:**可以使用命令模式实现事务,如提交和回滚操作。 * **宏命令:**可以使用命令模式实现宏命令,如“编译所有代码”。 * **备忘录:**可以使用命令模式实现备忘录,如支持撤销的操作。 **命令模式的实现方式:** * **接口:**定义一个接口,包含执行命令的方法。 * **实现类:**实现接口的方法,执行具体的命令。 **命令模式的示例:** ```java public interface Command { void doit(); void undo(); } public class CopyCommand implements Command { private Content content; public CopyCommand(Content content) { this.content = content; } @Override public void doit() { content.msg = content.msg + content.msg; } @Override public void undo() { content.msg = content.msg.substring(0, content.msg.length() / 2); } } ``` **UML 图:** ``` Command |-- DoIt() |-- Undo() |-- Content ``` **代码示例:** ```java public class Content { private String msg; public Content(String msg) { this.msg = msg; } public String msg() { return msg; } public void msg(String msg) { this.msg = msg; } } public class CopyCommand implements Command { private Content content; public CopyCommand(Content content) { this.content = content; } @Override public void doit() { content.msg = content.msg + content.msg; } @Override public void undo() { content.msg = content.msg.substring(0, content.msg.length() / 2); } } ```

正文

设计模式学习(二十一):命令模式

作者:Grey

原文地址:

博客园:设计模式学习(二十一):命令模式

CSDN:设计模式学习(二十一):命令模式

命令模式

命令模式是一种行为型模式。

通过调用者调用接受者执行命令,执行顺序是:

调用者→命令→接受者

```,

如下示例,CopyCommand 中的 `doit()`方法,就是执行这个 copy 的命令,undo 就是撤销上一次执行的命令,我们可以抽象出 Command 这个接口:

```java
public interface Command {
    void doit();

    void undo();
}

CopyCommand 实现这个接口,并实现doit()undo()这两个方法,其他的命令也可以类似的实现出来

public class CopyCommand implements Command {
    private Content content;

    public CopyCommand(Content content) {
        this.content = content;
    }

    @Override
    public void doit() {
        content.msg = content.msg + content.msg;
    }

    @Override
    public void undo() {
        content.msg = content.msg.substring(0, content.msg.length() / 2);
    }
}

上述示例的 UML 图如下

image

命令模式应用

  • 结合责任链模式实现多次 undo;

  • 结合组合模式实现宏命令;

  • 结合备忘录模式实现事务回滚;

UML 和 代码

UML 图

代码

更多

设计模式学习专栏

参考资料

与设计模式学习(二十一):命令模式相似的内容:

设计模式学习(二十一):命令模式

设计模式学习(二十一):命令模式 作者:Grey 原文地址: 博客园:设计模式学习(二十一):命令模式 CSDN:设计模式学习(二十一):命令模式 命令模式 命令模式是一种行为型模式。 通过调用者调用接受者执行命令,执行顺序是: 调用者→命令→接受者 ```, 如下示例,CopyCommand 中的

设计模式学习(二十):备忘录模式

设计模式学习(二十):备忘录模式 作者:Grey 原文地址: 博客园:设计模式学习(二十):备忘录模式 CSDN:设计模式学习(二十):备忘录模式 备忘录模式 备忘录模式是一种行为型模式。 用于记录对象的某个瞬间,类似快照的功能, 应用实例: 游戏中的「后悔药」; 打游戏时的存档; Windows

设计模式学习(二十二):解释器模式

设计模式学习(二十二):解释器模式 作者:Grey 原文地址: 博客园:设计模式学习(二十二):解释器模式 CSDN:设计模式学习(二十二):解释器模式 解释器模式 解释器模式是一种行为型模式。 解释器模式为某个语言定义它的语法(或者叫文法)表示,并定义一个解释器用来处理这个语法。 一般用于脚本语言

设计模式学习(二十三):中介模式

设计模式学习(二十三):中介模式 作者:Grey 原文地址: 博客园:设计模式学习(二十三):中介模式 CSDN:设计模式学习(二十三):中介模式 中介模式 中介模式是一种行为型模式。 举个简单的例子,如果一个聊天室里面的用户1和用户2要聊天,聊天室就相当于中介的地位,用户1和用户2只管调用发消息方

设计模式学习(二十四):Spring 中使用到的设计模式

设计模式学习(二十四):Spring 中使用到的设计模式 作者:Grey 原文地址: 博客园:设计模式学习(二十四):Spring 中使用到的设计模式 CSDN:设计模式学习(二十四):Spring 中使用到的设计模式 观察者模式 定义一个继承 ApplicationEvent 的事件;定义一个实现

设计模式学习(二)工厂模式——抽象工厂模式+注册表

目录前言使用简单工厂改进使用注册表改进参考文章 前言 在上一篇文章中我们提到了抽象工厂模式初版代码的一些缺点:①客户端违反开闭原则②提供方违反开闭原则。本文将针对这两点进行讨论 使用简单工厂改进 对于缺点①,我们可以使用简单工厂的思路来改进抽象工厂的初版代码。对于上一篇文章中的例子,我们去除Came

设计模式学习(二)工厂模式——抽象工厂模式

目录背景抽象工厂模式优点与缺点参考文章 背景 现在我需要开发一个相机操作模块,它可能在Windows下运行,也可能在Linux下运行。由于在厂家提供的SDK中,Windows下的SDK和Linux下的SDK是有区别的,因此对于一个品牌的相机,我们要创建两个类去封装这两个不同平台下的API。 我们先使

设计模式学习(二)工厂模式——工厂方法模式+注册表

目录工厂方法模式的瑕疵注册表 工厂方法模式的瑕疵 在前一篇笔记中我们介绍了工厂方法模式,示例的类图如下: 考虑一种情况:现在要在程序运行时,根据外部资源,动态的实例化对象。也就是说在编译期我们无法知道要实例化的对象的类型。因此在实例化的过程中,就需要加以判断。 例如,在我的例子中,要根据连接到主机的

设计模式学习(二):单例模式

设计模式学习(二):单例模式 作者:Grey 原文地址: 博客园:设计模式学习(二):单例模式 CSDN:设计模式学习(二):单例模式 单例模式 单例模式是创建型模式。 单例的定义:“一个类只允许创建唯一一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。”定

设计模式学习(十一):组合模式

设计模式学习(十一):组合模式 作者:Grey 原文地址: 博客园:设计模式学习(十一):组合模式 CSDN:设计模式学习(十一):组合模式 组合模式 组合模式是一种结构型模式。 组合模式中,最常用的一个用法就是目录层级的遍历,话不多说,直接上代码,主方法中 public class Main {