JAVA 命令模式

【Java设计模式】Java设计模式之(六)命令模式(Command Pattern) 本文目录 一、命令模式介绍 二、代码实现 2.1 通用类图 2.2 代码实现 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 一、命令模式介绍 意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。 主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤 阅读详情

文章目录

介绍

命令模式

实现

介绍

描述

命令模式设计模式属于行为型模式,将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

特点

优点:消除了请求发送者和具体指定接收者的耦合,让对象之间的调用关系更加灵活、新的关系也更容易添加。

缺点:可能导致系统产生许多个接收者类。

实现原理

当我们调用时,执行的时序首先是调用者类,然后是命令类,最后是接收者类。也就是说一条命令的执行被分成了三步,即调用者->命令->具体执行者。

适用

  1. 有常见的撤销(Undo)操作和恢复(Redo)操作。

命令模式

实现

遥控器操作,假设第一行对应电灯打开,则电灯对应为接收者。

第一步:初始化命令接口Command,并创建空实现。

// 创建命令接口
public interface Command {
    // 执行动作
    void execute();

    // 撤销动作
    void undo();
}
/**
 * 空执行,可用于初始化或者返回为空的条件
 * (空对象设计模式)
 * 可以省略对空的判断。例如数据库查到为null的结果,可以通过空对象模式返回提示信息
 */
public class NoCommand implements Command{
    @Override
    public void execute() {

    }

    @Override
    public void undo() {

    }
}

第二步:新建电灯接收者类Light,并且新建类LightOn、LightOff去实现Command,完成具体操作。

// 接收者
public class LightReceiver {
    public void on(){
        System.out.println("电灯 打开 ....");
    }
    public void off(){
        System.out.println("电灯 关闭 ....");
    }
}
// 电灯打开
public class LightOn implements Command{
    LightReceiver receiver;

    public LightOn(LightReceiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public void execute() {
        // 打开
        receiver.on();
    }

    @Override
    public void undo() {
        // 对应撤销 积为关闭
        receiver.off();
    }
}
// 电灯关闭
public class LightOff implements Command{
    LightReceiver receiver;

    public LightOff(LightReceiver receiver) {
        this.receiver = receiver;
    }

    @Override
    public void execute() {
        // 关闭
        receiver.off();
    }

    @Override
    public void undo() {
        // 对应撤销 即为打开
        receiver.on();
    }
}

第三步:创建真正执行命令的类RemoteController(遥控器),5个槽位,则对应10个开、闭按钮,每行对应一个接收者。

public class RemoteController {
    Command[] onCommands; // 所有打开的命令
    Command[] offCommands; // 所有关闭的命令
    Command undoCommand; // 执行撤销命令

    public RemoteController() {
        onCommands = new Command[5];
        offCommands = new Command[5];
        // 初始化 个数 对应按钮个数
        for (int i =0;i<5;i++){
            // 对每一个命令 实现空操作
            onCommands[i] = new NoCommand();
            offCommands[i] = new NoCommand();
        }
        // 撤销按钮初始化
        undoCommand = new NoCommand();
    }

    // 设置相应命令
    public void setCommand(int idx,Command on,Command off){
        onCommands[idx] = on;
        offCommands[idx] = off;
    }

    // 按下某个打开按钮
    public void onBtn(int idx){
        onCommands[idx].execute();
        // 记录撤销
        undoCommand = onCommands[idx];
    }

    // 按下某个关闭按钮
    public void offBtn(int idx){
        offCommands[idx].execute();
        // 记录撤销
        undoCommand = offCommands[idx];
    }

    // 按下撤销
    public void undoBtn(){
        // 执行 该 对象的 撤销命令
        undoCommand.undo();
        undoCommand = new NoCommand();
    }
}

第四步:测试。

public class Test {
    public static void main(String[] args) {
        // 遥控器 初始化操作  ----------
        // 创建电灯接收者
        LightReceiver receiver = new LightReceiver();
        // 创建电灯打开命令
        LightOn lightOn = new LightOn(receiver);
        LightOff lightOff = new LightOff(receiver);
        RemoteController controller = new RemoteController();
        // 0 号位置 代表电灯
        controller.setCommand(0,lightOn,lightOff);
        // Tips : 内部初始化5个位置 当有其他接收者加入 设置对应位置即可
        // 遥控器 初始化结束 -----------

        // 调用
        controller.onBtn(0); // 打开 0号位置 -> 对应电灯的打开
        controller.offBtn(0); // 关闭 0 号位置 -> 对应电灯的关闭
        controller.undoBtn(); // 执行保留的撤销命令
        /*
        电灯 打开 ....
        电灯 关闭 ....
        电灯 打开 ....
        */
    }
}

 

gps matlab 书,《GPS基本原理及其Matlab仿真》杨俊.pdf 本书讲述了全球定位系统(GPS)的基本原理和概念,具体包括:GPS测量原理、GPS的结构和发展历史;GPS伪距定位和载波相位定位的原理;GPS中使用的坐标系和时间系统;C/A码的实现原理及载波调制过程;GPS信号捕获和跟踪原理及实现;便携式GPS系统的设计与实现及常用芯片资料等。此外,本书还讲了利用Matlab仿真GPS中涉及到的各种算法和原理,并且给出了所有仿真源程序和仿真框图。利用Matlab... 阅读详情

相关推荐

Vivado SDK中LWIP库版本冲突与RTL8211FDI兼容性实战解析

本文深入解析Vivado 2019.1 SDK中LWIP 1.0库与RTL8211FDI千兆PHY芯片的版本冲突问题,并提供实战解决方案。通过手动移植高版本LWIP库、整合第三方驱动及优化BSP配置,有效解决了以太网通信兼容性问题,确保千兆性能稳定运行。

ios99的博客 276

JAVA设计模式之命令模式

转自http://www.kongzid.com/archives/design17,命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。其别名为动作(Action)模式或事务(Transaction)模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。(将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。) 命令...

孔子说 3455

Depth Anything 3实战:如何用DINOv2 Transformer一键生成3D高斯点云?

本文详细介绍了Depth Anything 3(DA3)模型如何利用DINOv2 Transformer架构,实现从单张或多视角图像一键生成高质量3D高斯点云。DA3通过统一的深度-射线表示和自适应注意力机制,简化了传统复杂的3D重建流程,并可直接微调用于3D高斯渲染,为图形学、CV和内容创作领域提供了高效的端到端解决方案。

postgres8guard的博客 722

JAVA设计模式之命令模式详解

命令模式(command pattern)的定义: 命令模式将请求(命令)封装为一个对象,这样可以使用不同的请求参数化其他对象(将不同请求依赖注入到其他对象并且能够支持请求(命令)的排队执行、记录日志、撤销等 (附加控制)功能。命令模式的核心是将指令信息封装成一个对象,并将此对象作为参数发送给接收方去执行,达到使命令的请求与执行方解耦,双方只通过传递各种命令对象来完成任务.在实际的开发中,如果你用到的编程语言并不支持用函数作为参数来传递,那么就可以借助命令模式将函数封装为对象来使用。

励志成为一名优秀的全能型软件开发工程师。 1943

商品评论中的实体情感分析

在之前的文章中我已经将商品评论中的评价实体,也就是特征(feature)给挖掘出来了,我看了一下,挖掘的效果还是不错的。原文链接:http://blog.youkuaiyun.com/chixujohnny/article/details/52794685 下面一步要做的是施加情感因子,也就是说,要将人们评论时候所连带的感情程度施加一下。这项任务的归类应该是情感分析技术。 目前该类问题的情感分析技

chixujohnny 7974

DTW Barycenter Averaging(DBA)——平均序列求法

DBA该算法是用来求序列数据集SS的一致序列(平均序列)。由Franc-ois Petitjean提出的。目前,该方法求得的平均序列是最准确的。 假设一元组为S={s1,s2,⋯,sn}S={s1,s2,\cdots,sn},当SS中的元素为实数时,很容易求的SS的平均值: avg=s1+s2+⋯+snn(1) avg = \dfrac{s1 +s2+\cdots+sn}{n} \qquad\q

光怪陆离 1万+

【设计模式】用Java实现命令模式

命令模式(Command Pattern)是一种行为设计模式,它将请求封装为一个对象,从而使你可以使用不同的请求对客户端进行参数化。命令模式还支持请求的排队、记录日志、撤销操作等功能。命令接口(Command):定义执行命令的方法,可以是抽象类或接口。具体命令类(Concrete Command):实现命令接口,封装了具体的请求和接收者,负责执行请求。接收者类(Receiver):执行实际的操作,命令对象将请求委托给接收者来执行。

分享Java硬核干货 1万+

uniapp+openlayers集成天地图实战:renderjs通信陷阱与性能优化避坑指南

本文深入探讨了uniapp与openlayers集成天地图时的renderjs通信陷阱与性能优化策略。通过实战案例解析了renderjs的特殊通信机制、地图实例生命周期管理、图层懒加载等关键技巧,帮助开发者避免常见坑点,提升应用流畅度。特别针对多语言切换、热重载偏移等疑难问题提供了解决方案,是uniapp+openlayers开发者的实用避坑指南。

weixin_30872157的博客 362

JAVA设计模式--命令模式

命令 (Command) 模式又叫作动作 (Action) 模式或事务 (Transaction) 模式,是一种对象的行为模式。将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。命令模式的本质:封装请求设计意图:命令模式通过将请求封装到一个命令 (Command) 对象中,实现了请求调用者和具体实现者之间的解耦。命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。

贵公子丶笔记 1376

怎么调用onenet平台的API从而读取我们的设备数据和下发命令,做到控制开关

怎么调用onenet平台的API从而读取我们的设备数据和下发命令,做到控制开关 1、首先是怎么读取数据 读取的API是:http://api.heclouds.com/devices/datapoints?devIds=629063002 其中devids这个指的是你的设备ID 然后在我们的headers里面添加一些必要参数,就可以调用了 其中api-key的是你产品里面的master-apikey 把我们的参数写好就可以调用了,选择get方式,点击发送 这个value就是我们需要获取到的参数值了,

zyh960的博客 2万+

Python 爬虫项目:爬取百度贴吧帖子,保存标题与评论内容

在 Python 爬虫技术的学习与实战体系中,贴吧类动态内容爬取是典型的入门进阶案例,百度贴吧作为国内主流的社区论坛平台,其页面结构规范、数据载体清晰,非常适合用于巩固爬虫核心技术栈。本次实战项目基于requests请求库与解析库实现完整的爬取流程,从网页请求、数据解析、内容提取到本地持久化存储全链路落地,既能掌握基础爬虫的核心逻辑,也能理解网页结构化数据解析的通用思路,同时规避爬虫常见的反爬基础策略,具备极高的实战参考价值。本文核心价值。

2503_91057718的博客 2544

16-Java命令模式 ( Command Pattern )

1. 意图将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化2. 主要解决在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适3. 何时使用在某些场合,比如要对行为进行”记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将”行为请求者”与”行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合4. 如何解决。

深入Java世界:探索编程之美与技术深度 1586

《Arduino与LabVIEW开发实战》第2章 LabVIEW基础

第2章 LabVIEW基础 2.1 LabVIEW与虚拟仪器 2.1.1 什么是虚拟仪器 仪器仪表发展方向有很多,其中一个重要方向是将计算机和仪器结合起来。具体来说有两种方式,一种是将微处理器或微控制器嵌入到仪器中,构建智能化的内含嵌入式系统的仪器仪表,这是嵌入式仪器;另一种是将仪器装入计算机中,以通用计算机硬件及操作系统为载体,外配数据采集卡等外部设备,通过编制不同功能的程序,以实现多种仪...

jxgy01的博客 490

java——命令模式(Command pattern)

8.命令模式(Command pattern)

超人迪X 136

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

JAVA设计模式之 命令模式【Command Pattern】

一、概述     命令模式可以将请求发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。核心在于引入了命令类,通过命令类来降低发送者和接收者的耦合度,请求发送者只需指定一个命令对象,再通过命令对象来调用请求接收者的处理方法,命令模式是一种对象行为型模式。 二、使用场景 1>、系统要求请求发送者和接收者的解耦

小吕丶Code阶区 2592

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Java设计模式 Design Pattern:命令模式 Command Pattern

Java设计模式 Design Pattern:命令模式 Command Pattern 目的 Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support un...

ahch8077的博客 165

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java之命令模式(Command Pattern)

Java之命令模式(Command Pattern)

Sup_Heaven的专栏 1106

Java 设计模式-命令模式(Command Pattern)

命令模式(Command Pattern)是对象的行为模式,其意图是将请求封装在对象的内部。 命令模式涉及的角色有: 客户端(Client )角色:负责创建一个具体的命令,并指定命令的接受者 命令(Command)角色:定义一个命令公共的操作接口 具体命令(Concrete Command)角色:定义一个命令的接收者和行为之间的耦合。实现命令接口的公共接口,调用接......

技术分享 261

JAVA:命令模式(Command Pattern)的技术指南

命令模式是一种行为型设计模式,它将请求封装为独立对象,使请求的发送者和接收者解耦。该模式支持参数化、队列化操作,并可以轻松实现撤销/重做功能。通过命令接口、具体命令、接收者和调用者等角色,命令模式能够将操作封装为对象,使系统更灵活可扩展。典型的应用场景包括GUI按钮操作、文本编辑器撤销功能和智能家居设备控制等。虽然会增加类的数量,但命令模式能有效降低系统耦合度,是设计灵活可扩展系统的重要工具。

木头 603

【Java设计模式】11命令模式

命令模式(Command)是指,把请求封装成一个命令,然后执行该命令。

weixin_44943389的博客 123

java命令模式应用_Java之命令模式(Command Pattern)

三、举例本来想接着我的JUnit分析来讲解命令模式。但是由于在JUnit中,参杂了其它的模式在里面,使得命令模式的特点不太明显。所以这里将以命令模式在Web开发中最常见的应用——Struts中Action的使用作为例子。在Struts中Action控制类是整个框架的核心,它连接着页面请求和后台业务逻辑处理。按照框架设计,每一个继承自Action的子类,都实现execute方法——调用后台真正处理业...

weixin_39670849的博客 180

Java设计模式(十五)行为型- 命令模式Command Pattern(史上最全命令模式)与使用场景以及优缺点

命令模式

移动端开发与最新技术 477

java设计模式--命令模式(Command Pattern)

Java之命令模式(Command Pattern) 1.概念   将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化。用于“行为请求者”与“行为实现者”解耦,可实现二者之间的松耦合,以便适应变化。分离变化与不变的因素。    在面向对象的程序设计中,一个对象调用另一个对象,一般情况下的调用过程是:创建目标对象实例;设置调用参数;调用目标对象的方法。 但在有些情况...

白开水的世界 210

Java命令模式(Command Pattern)

一、看一个具体的需求 我们买了一套智能家电,有照明灯、风扇、冰箱、洗衣机,我们只要在手机上安装app就可以控制对这些家电工作。 这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个App,分别控制,我们希望只要一个app就可以控制全部智能家电。 要实现一个app控制所有智能家电的需要,则每个智能家电厂家都要提供一个统一的接口给app调用,这时 就可以考虑使用命令模式。 命令模式可将“动作的请求者”从“动作的执行者”对象中解耦出来.。 在我们的例子中,动作的请求者是手机app,动作的执行者是每个厂商

weixin_44256581的博客 315

Java设计模式 十七 命令模式 (Command Pattern)

命令模式通过将请求封装成对象,解耦了请求的发送者和接收者,提供了灵活的执行、撤销和组合命令的能力。它在需要解耦请求和执行的场景中非常有用,尤其适用于GUI系统、任务调度、宏命令等应用场景。虽然命令模式可能增加系统的复杂度,但它在结构上更具可扩展性和灵活性,非常适合处理复杂的操作逻辑。

空 747

命令模式 java_Java命令模式

Java设计模式之命令模式命令模式的概念其实还挺模糊的,虽然不难,但是直接看起来也有点晕,直接看代码过一遍再去了解概念会好一些。其实简单的说命令模式就是将一个"请求"封装成一个对象,通过这个对象直接就能找到对应的执行命令。优点:好处是对于需要重复修改或实现的一些固定的操作,可以很方便的去执行,而不用抽丝剥茧的每次都和细分后的环节打交道,只需要和一个接受者打交道就行了。比如客户经常需要频繁的改需求,...

weixin_32946543的博客 276
上一篇: JAVA 模板模式
下一篇: JAVA 中介者模式
✧V
博客等级 码龄9年 1粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值