设计模式之命令模式

文章目录

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

一、介绍

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

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

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

二、命令模式中的角色

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

  • 抽象命令接口Command

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

    public interface Command {
    
        void execute();
    }
    
  • 命令接口实现类XXXCommand

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

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

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

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

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

在这里插入图片描述

三、案例

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

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

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

1. 命令的抽象接口Command

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

public interface Command {

    void execute();
}

2. 进攻AttackCommand

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

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

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

3. 意大利炮cannonCommand

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

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

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

4. 开炮FireCommand

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

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

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

5. 李云龙LiYunLong

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

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. 运行案例

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

在这里插入图片描述

四、优缺点

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

优点:

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

缺点:

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


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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/104062.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

系统架构设计师之RUP软件开发生命周期

系统架构设计师之RUP软件开发生命周期

自建的离散傅里叶变换matlab程序实现及其与matlab自带函数比较举例

自建的离散傅里叶变换matlab程序实现及其与matlab自带函数比较举例 在matlab中有自带的离散傅里叶变换程序,即fft程序,但该程序是封装的,无法看到源码。为了比较清楚的了解matlab自带的实现过程,本文通过自建程序实现matlab程序&…

IntelliJ IDEA 2023.2正式发布,新UI和Profiler转正

你好,我是YourBatman:做爱做之事❣交配交之人。 📚前言 北京时间2023年7月26日,IntelliJ IDEA 2023.2正式发布。老规矩,吃肉之前,可以先把这几碗汤干了,更有助于消化(每篇都很顶哦…

排序-表排序

当我们需要对一个很大的结构体进行排序时,因为正常的排序需要大量的交换,这就会造成时间复杂度的浪费 因此,我们引入指针,通过指针临时变量的方式来避免时间复杂度的浪费 间接排序-排序思路:通过开辟一个指针数组&…

十个最常用的计算机视觉数据集

如今,人工智能和机器学习领域中最振奋人心的一个分支是计算机视觉(Computer Vision,简称CV)。CV应用于多种场景,以改善我们的日常生活,并推进科学技术研究。其中包括: 自动驾驶自动生成图像描述…

重入漏洞EtherStore

重入漏洞 // SPDX-License-Identifier: MIT pragma solidity ^0.8.13;contract EtherStore {mapping(address > uint) public balances;function deposit() public payable {balances[msg.sender] msg.value;}function withdraw() public {uint bal balances[msg.sender]…

Linux 函数调用的用户态与内核态

在用户态中,程序的执行往往是一个函数调用另一个函数。函数调用都是通过栈来进行的。 在进程的内存空间里面,栈是一个从高地址到低地址,往下增长的结构,也就是上面是栈底,下面是栈顶,入栈和出栈的操作都是…

ModbusTCP 转 Profinet 主站网关在博图配置案例

兴达易控ModbusTCP转Profinet网关,在 Profinet 侧做为 Profinet 主站控制器,接 Profinet 设备,如伺服驱动器;兴达易控ModbusTCP 和 Profinet网关在 ModbusTCP 侧做为 ModbusTCP 从站,接 PLC、上位机、wincc 屏等。 拓…

k8s kubeadm配置

master 192.168.41.30 docker、kubeadm、kubelet、kubectl、flannel node01 192.168.41.31 docker、kubeadm、kubelet、kubectl、flannel node02 192.168.41.32 do…

python 字典dict和列表list的读取速度问题, range合并

嗨喽,大家好呀~这里是爱看美女的茜茜呐 python 字典和列表的读取速度问题 最近在进行基因组数据处理的时候,需要读取较大数据(2.7G)存入字典中, 然后对被处理数据进行字典key值的匹配,在被处理文件中每次…

Python:实现日历到excel文档

背景 日历是一种常见的工具,用于记录事件和显示日期。在编程中,可以使用Python编码来制作日历。 Python提供了一些内置的模块和函数,使得制作日历变得更加简单。 在本文,我们将探讨如何使用Python制作日历,并将日历输出到excel文档中。 效果展示 实现 在代码中会用到cale…

TypeScript学习 | 泛型

简介 泛型是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性 作用 可以保证类型安全的前提下,让函数、接口或类与多种类型一起工作,从而实现复用 基本使用 举个例子: 创…

各品牌PLC存储器寻址的规则

在PLC编程时,字节或多字节的变量一般支持绝对地址寻址(比如,IW0、MD4等)。要想正确寻址,则必须要搞清楚寻址的规则。目前常见的规则有两种:字节寻址和字寻址。下图清晰地表达了两种规则的编号情况&#xff…

【C++】stackqueue

适配器是一种设计模式 , 该种模式是将一个类的接口转换成客户希望的另外一个接口 。 虽然 stack 和 queue 中也可以存放元素,但在 STL 中并没有将其划分在容器的行列,而是将其称为 容器适配 器 ,这是因为 stack 和队列只是对其他容…

上传和下载文件到google drive/Local pc

1 上传 参考:使用 Python 将文件上传到 Google 云端硬盘_迹忆客 Upload file to google drive using Python - CodeSpeedy (没起作用,但可以参考一下) 第 1 步:Google API Playground 我们可以通过搜索 Google 找到更多关于 Google API Pla…

vue路径中“@/“代表什么

举例&#xff1a; <img src"/../static/imgNew/adv/tupian.jpg"/>其中&#xff0c;/是webpack设置的路径别名&#xff0c;代表什么路径&#xff0c;要看webpack的build文件夹下webpack.base.conf.js里面对于是如何配置&#xff1a; 上图中代表src,上述代码就…

出海路上离不开的Email营销,教你这样来优化!

随着互联网的不断发展&#xff0c;Email已经成为人们工作和生活中不可或缺的一部分。尤其是对于我们这些跨境企业而言&#xff0c;发送Email是一个促进销售和维护客户关系的良好渠道。而且邮件的价格也是比较低廉的&#xff0c;很适合用于日常推广营销&#xff0c;所以人手几个…

论文阅读 - Coordinated Behavior on Social Media in 2019 UK General Election

论文链接&#xff1a; https://arxiv.org/abs/2008.08370 目录 摘要&#xff1a; Introduction Contributions Related Work Dataset Method Overview Surfacing Coordination in 2019 UK GE Analysis of Coordinated Behaviors 摘要&#xff1a; 协调的在线行为是信息…

嵌入式软件工程师面试题——2025校招专题(三)

说明&#xff1a; 面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但在这里博主希望每一个题目&#xff0c;大家都要…

在nodejs中实现实时通信的几种方式

在nodejs中实现实时通信的几种方式 在当今世界中&#xff0c;实时通信至关重要。无论是聊天应用程序还是实时体育更新&#xff0c;实时通信都是保持用户活跃度所必需的。Node.js 因其速度、可扩展性和可靠性而成为开发实时应用程序的流行工具。在本文中&#xff0c;我们将探讨…