设计模式之命令模式

文章目录

  • 一、介绍
  • 二、命令模式中的角色
  • 三、案例
    • [1. 命令的抽象接口`Command`](#1. 命令的抽象接口Command)
    • [2. 进攻`AttackCommand`](#2. 进攻AttackCommand)
    • [3. 意大利炮`cannonCommand`](#3. 意大利炮cannonCommand)
    • [4. 开炮`FireCommand`](#4. 开炮FireCommand)
    • [5. 李云龙`LiYunLong`](#5. 李云龙LiYunLong)
    • [6. 运行案例](#6. 运行案例)
  • 四、优缺点

一、介绍

命令模式(Command Pattern) ,属于行为型设计模式 。指的是把方法调用封装成命令,然后执行该命令。目的是为了将类中的各个方法抽出来,形成独立的类,且该类只有一个方法execute(),调用该类的execute()方法就等同于调用原类中对应的方法。

更接地气的说法是,A类中有B、C、D三个方法,使用命令模式,将这三个方法抽出来形成独立的类:BCommondCCommondDCommond,这三个类都实现Command接口中的execute()方法,方法的具体实现与A类中的B、C、D三个方法相同。

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

二、命令模式中的角色

在命令模式中,我们需要将一个类中的方法都提取出来,将它们封装成对应的命令类(XXXCommand) ,通过调用这些命令类的执行方法execute()来运行对应的逻辑,因此我们可以声明一个命令的抽象接口Command ,由不同的具体命令实现该抽象接口。因此,命令模式中包含两个角色:抽象命令接口Command、命令接口实现类XXXCommand

  • 抽象命令接口Command

    定义一个命令的基本功能方法execute(),用于执行命令。代码如下所示

    java 复制代码
    public interface Command {
    
        void execute();
    }
  • 命令接口实现类XXXCommand

    实现抽象命令接口Command ,对接口中的execute()方法进行具体实现。代码如下所示

    java 复制代码
    public class XXXCommand implements Command{
    
        @Override
        public void execute() {
            System.out.println("执行XXX命令对应的逻辑...");
        }
    }
  • 调用命令的客户端类CommandClient

    在客户端中,通过对命令对象的声明,进而调用该对象的execute()方法以执行对应的命令。

    java 复制代码
    public class CommandClient {
    
        public static void main(String[] args) {
            XXXCommand command = new XXXCommand();
            command.execute();
        }
    }

下面是命令模式的通用UML类图

三、案例

没办法,一说到命令俺就只能想到打仗,那就不妨以李云龙攻打平安县城为例吧。哈哈哈。

李云龙作为三八六旅独立团团长,可以向他指挥的士兵下达任何作战命令,比如:进攻(attack)拉意大利炮(cannon)开炮(fire),对于这三个命令来说,李云龙相当于命令模式中的客户端,通过下达这几个命令,他的士兵就会执行相应的命令。

因此结合案例,我们通过代码对其进行演示。

1. 命令的抽象接口Command

每一个命令都需要被执行,因此将其抽象为接口类Command,并声明其执行方法execute()

java 复制代码
public interface Command {

    void execute();
}

2. 进攻AttackCommand

新建进攻命令AttackCommand ,并实现命令接口Command定义的execute()方法。

当李云龙对着战士们说:兄弟们冲啊。此时就下达了进攻命令。

java 复制代码
public class AttackCommand implements Command{
    @Override
    public void execute() {
        System.out.println("士兵进行冲锋进攻。。。");
    }
}

3. 意大利炮cannonCommand

与**进攻命令(AttackCommand)**相似,实现命令接口,实现方法逻辑。

当李云龙对着二营长说:**二营长,你他娘的意大利炮呢?**此时就下达了拿出意大利炮的命令。

java 复制代码
public class CannonCommand implements Command{
    @Override
    public void execute() {
        System.out.println("二营长将意大利炮拉出来了。。。");
    }
}

4. 开炮FireCommand

与**进攻命令(AttackCommand)**相似,实现命令接口,实现方法逻辑

当李云龙对着战士说:开炮~~~,这就是开炮命令,战士则需要向平安县城城楼开炮了。

java 复制代码
public class FireCommand implements Command{
    @Override
    public void execute() {
        System.out.println("士兵向平安县城城楼开炮。。。");
    }
}

5. 李云龙LiYunLong

李云龙作为独立团指挥官,负责下达各种作战命令。

java 复制代码
public class LiYunLong {

    public static void main(String[] args) {
        System.out.println("李云龙:兄弟们冲啊");
        AttackCommand attackCommand = new AttackCommand();
        attackCommand.execute();
        System.out.println();

        System.out.println("李云龙:二营长,你他娘的意大利炮呢?");
        CannonCommand cannonCommand = new CannonCommand();
        cannonCommand.execute();
        System.out.println();

        System.out.println("李云龙:开炮~~~");
        FireCommand fireCommand = new FireCommand();
        fireCommand.execute();
    }
}

6. 运行案例

运行以上案例,模拟李云龙下达作战命令后,得到以下输出

四、优缺点

使用命令模式后,我们可以总结出以下优缺点

优点:

  • 降低了系统耦合度
  • 新的命令可以很容易添加到系统中去。

缺点:

  • 导致系统有过多的具体命令类。每一个命令都需要新建一个类。

纸上得来终觉浅,绝知此事要躬行。

------------------------我是万万岁,我们下期再见------------------------

相关推荐
诸葛悠闲4 分钟前
设计模式——桥接模式
设计模式·桥接模式
Yan.love15 分钟前
开发场景中Java 集合的最佳选择
java·数据结构·链表
椰椰椰耶18 分钟前
【文档搜索引擎】搜索模块的完整实现
java·搜索引擎
大G哥18 分钟前
java提高正则处理效率
java·开发语言
智慧老师1 小时前
Spring基础分析13-Spring Security框架
java·后端·spring
lxyzcm1 小时前
C++23新特性解析:[[assume]]属性
java·c++·spring boot·c++23
V+zmm101341 小时前
基于微信小程序的乡村政务服务系统springboot+论文源码调试讲解
java·微信小程序·小程序·毕业设计·ssm
Oneforlove_twoforjob2 小时前
【Java基础面试题025】什么是Java的Integer缓存池?
java·开发语言·缓存
xmh-sxh-13142 小时前
常用的缓存技术都有哪些
java
AiFlutter2 小时前
Flutter-底部分享弹窗(showModalBottomSheet)
java·前端·flutter