命令模式(十七)

news2024/10/7 20:26:57

相信自己,请一定要相信自己

上一章简单介绍了模板模式(十六), 如果没有看过, 请观看上一章

一. 命令模式

定义:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,

这样方便将命令对象进行储存、传递、调用、增加与管理。

意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。

主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,

比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。

在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。

如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。

组成角色具体关系作用
抽象命令类(Command)Command声明执行命令的接口,拥有执行命令的抽象方法声明执行命令的接口,拥有执行命令的抽象方法
具体命令角色(Concrete Command)LightOff, LightOn抽象命令类的具体实现类,它拥有接收者对象,并通过调用接收者的功能来完成命令要执行的操作抽象命令类的具体实现类,它拥有接收者对象,并通过调用接收者的功能来完成命令要执行的操作
实现者/接收者(Receiver)LightCommandReceiver执行命令功能的相关操作,是具体命令对象业务的真正实现者执行命令功能的相关操作,是具体命令对象业务的真正实现者
调用者/请求者(Invoker)角色RemoteSend请求的发送者,它通常拥有很多的命令对象,并通过访问命令对象来执行相关请求,它不直接访问接收者请求的发送者,它通常拥有很多的命令对象,并通过访问命令对象来执行相关请求,它不直接访问接收者

image-20230615164457948

二. 命令模式实例

二.一 抽象命令 Command

public interface Command {
    /**
     执行命令
     */
    public void execute();
    /**
     撤销命令
     */
    public void undo();
}

二.二 具体命令实现

开灯:

public class LightOn implements Command{

    private LightCommandReceiver lightCommandReceiver;

    public LightOn( LightCommandReceiver lightCommandReceiver) {
        this.lightCommandReceiver = lightCommandReceiver;
    }

    @Override
    public void execute() {
        lightCommandReceiver.on();
    }

    @Override
    public void undo() {
        lightCommandReceiver.off();
    }
}

关灯:

public class LightOff implements Command{

    private LightCommandReceiver lightCommandReceiver;

    public LightOff(LightCommandReceiver lightCommandReceiver) {
        this.lightCommandReceiver = lightCommandReceiver;
    }

    @Override
    public void execute() {
        lightCommandReceiver.off();
    }

    @Override
    public void undo() {
        lightCommandReceiver.on();
    }


}

二.三 接收者 LightCommandReceiver

@Slf4j
public class LightCommandReceiver {
    public void on() {
        log.info("电灯打开了");
    }

    public void off() {
        log.info("电灯关闭了");
    }
}

二.四 请求者 RemoteSend

public class RemoteSend {

    private Command command;

    public RemoteSend (Command command) {
        this.command = command;
    }

    public void setCommand(Command command) {
        this.command = command;
    }


    public void execute() {
        command.execute();
    }

    public void undo() {
        command.undo();
    }
}

二.五 测试类使用

     @Test
    public void oneTest() {

        LightCommandReceiver lightCommandReceiver = new LightCommandReceiver();

        Command lightOn = new LightOn(lightCommandReceiver);

        RemoteSend remoteSend = new RemoteSend(lightOn);
        remoteSend.execute();
        remoteSend.undo();

        Command lightOff = new LightOff(lightCommandReceiver);
        remoteSend = new RemoteSend(lightOff);
        remoteSend.execute();
        remoteSend.undo();
    }

image-20230615165250320


本章节的代码放置在 github 上:


https://github.com/yuejianli/DesignPattern/tree/develop/Command


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能锁语音芯片方案,NV170D-SOP8九芯电子自主研发

随着智能家居市场的不断壮大,智能门锁已经成为越来越多家庭不可或缺的一部分。传统的机械锁门的开锁方式已经无法满足人们对安全和便捷性的需求。而电子锁门随着技术的不断突破,拥有了更为丰富的功能和更高的安全性。 但是,目前市场上有那么…

1.4.2:DHTMLX JS 看板 DHTMLX JS Kanban Board Crack

用于任务管理应用 程序的 敏捷 JavaScript 看板,使用 DHTMLX JavaScript 看板库开发成熟的 Web 应用程序,以获得对工作量的完全控制并有效地管理任务。 开始使用 DHTMLX JS 看板 DHTMLX 看板允许创建任意数量的任务并通过右侧面板编辑它们。用户可以编…

uCOSii的任务延时和软件定时器

uCOSii的任务延时和软件定时器 1、心跳节拍 操作系统的心跳节拍称为一个Tick。uCOSii中有一个专用的心跳节拍函数:OSTimeTick(),每调用一次,系统时间计数器OSTime计数器就会加1次。为了能调用这个心跳节拍函数,我们使用CPU的滴答…

极致呈现系列之:Echarts地图的浩瀚视野(二)

今天我将基于上一个博客讲到的Echarts地图的相关知识,来实现一个三维地图的效果,我将通过两种方式来实现,一种是伪3D效果的中国地图效果,为什么说是伪3D效果呢,跟着做完你就明白了;一种是真正的三维效果中国…

Eclipse添加Spket插件实现ExtJs智能提示

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、使用步骤1.解压Spket插件2.重启 Eclipse3.配置 Spket4.添加 Library5.添加 File6.将 extjs 设置为 Default7.将 *.js 文件的默认编辑器设置为 Spket JavaSc…

本地连接服务器搭建的 Redis 集群

本地连接服务器搭建的 Redis 集群 在实际运行测试中,存在两个问题 安全组或防火墙开放端口 主要开放10000端口。如果要连接 Redis集群的应用服务不和 Redis集群在一个局域网下,会出现连接异常。 第一个问题检查防火墙或安全组就可以解决,第…

我为开放原子全球开源峰会助力

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

Linux运维监控学习笔记1

1. 监控系统的概念: 监控系统,将所有需要监控的服务器及其各种各种需要的状态数据都实时地收集,并图形化地展示,并可以进行报警,让机器主动及时地与人沟通。 2. 为什么要监控? 答:实时地收集数…

练习:逻辑回归

练习2:逻辑回归 介绍 在本练习中,您将实现逻辑回归并将其应用于两个不同的数据集。还将通过将正则化加入训练算法,来提高算法的鲁棒性,并用更复杂的情形来测试模型算法。 在开始练习前,需要下载如下的文件进行数据上…

【开发细节】SpringBoot配置文件的spring.profiles下的active和include属性的区别和作用

目录 问题作用spring.profiles.activespring.profiles.include 总结 问题 我们经常在项目的application.yml中看到这样的配置,如下: 在 Spring Boot 中,spring.profiles.active 和 spring.profiles.include 属性都是用来配置 profile 的。 …

C++设计模式之单例模式(Singleton)

文章目录 定义前言1. 问题2. 解决方案 适用场景实现方式优点缺点与其他模式的关系懒汉单例模式代码1. 线程不安全的懒汉单例模式2. 线程安全的懒汉单例模式 饿汉单例模式代码Meyers Singleton优点:缺点: 定义 单例是一种创建型设计模式,让你…

从“五个女博士”事件,论品牌广告营销的正确姿势

【潮汐商业评论/原创】 “她经济”是一片浩浩荡荡又风云变幻的海,“美”则是其中贯穿女性一生的课题,如果说这两年这个课题有什么变化,那就是从“女为悦己者容”到“女为自己容”,女性追求美的出发点早就不再是取悦他人“服美役”…

从外资企业数字化趋势看MNC根植中国的新逻辑

导读:外企数字化发展,也要“在中国,为中国” 外资企业一直是中国经济发展的重要推动力量。根据商务部数据,2022年中国实际使用外商直接投资金额达到1891亿美元,创历史新高,同比增速为8%。中国经济强大的韧性…

linux下文件锁使用总结

linux锁存在强制锁(mandatory lock)和劝告锁(advisory lock)。所谓强制锁,就是一个进程获取了那把锁(只有一把钥匙),只有一个进程可以操作,别的进程无能为力。所谓劝告锁…

【数据库】Mysql索引、事务与存储引擎

文章目录 一、索引介绍1. 索引的概念2. 索引的作用与副作用2.1 索引的作用2.2 索引的副作用2.3 如何实现索引 3. 创建索引的原则依据4. 索引的分类和创建4.1 普通索引直接创建索引修改表方式创建创建表的时指定索引 4.2 唯一索引直接创建唯一索引修改表方式创建创建表的时候指定…

实测Maven依赖包可通过域名抢注实现钓鱼攻击吗

先说结论:基本不可行 原理 Maven包中 groupId 字段是域名反写,比如你有一个 12345.com,就可以申请到 com.12345 的groupId。 很多开源项目都停止维护,但是很多人使用,这些团队可能忘记续费域名;同时目前…

keras运行debug解决protobuf版本冲突

# code 5.4 使用Keras实现异或网络 import numpy as np from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Activation from tensorflow.keras.optimizers import SGD x_train np.array([[0, 0],[0, 1],[1, 0],[1, 1] ]) y_train …

她98年的,我玩不过她...┭┮﹏┭┮

现在的小年轻真的卷得过分了。前段时间我们公司来了个98年的,工作没两年,跳槽到我们公司起薪18K,都快接近我了。后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天,原来这位小老弟家里条…

高级VLAN_vlan聚合(Super VLAN)实验

vlan聚合(Super_VLAN) 就是在一个物理网络里面用多个vlan来隔离广播域,将这个vlan聚合成一个逻辑vlan就有了Super vlan,这些多个vlan共用一个ip子网和网关, 目的就是为了节约ip地址资源 普通vlan示意图 普通vlan就存在很多网关,有的vlan可能会存在只有20个主机设备,但是需要划…

罗德FSH13手持式频谱分析仪RohdeSchwarz

FSH4和R&S?FSH8是罗德与施瓦茨公司全新推出面向未来应用的手持式频谱分析仪。它集频谱分 析、天馈线分析、全功能矢量网络分析、矢量电压表、功率计主机、宽带通信解调等多种测试功能 于一身,拥有媲美中高档台式频谱仪的指标。R&S?FSH4和R&S?FSH8完美…