命令模式

第一篇:常见CAN错误帧及其排查方向 在本文中主要阐述各类错误帧的形成原因以及在使用同星硬件设备出现错误帧时,应当 如何进行排查并消除错误帧。在 CAN 总线通信中,通常遇见的错误帧主要为以下五种,其 分别是:bit error、ACK error、stuff error、CRC error 以及 form error。 阅读详情

(本文中一些例子和定义均摘自《Head First 设计模式》)
命令模式(Command Pattern)
将“请求”封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象。命令模式也支持可撤消的操作。

举例:开灯的命令
首先我们定义一个命令接口,所有的命令都应当实现这个接口

public interface Command {
    
public void execute();
}

 在Light类中,厂商定义了开和关的命令

public class Light {
    
public void on(){
        System.out.println(
"Light on.......");
    }

    
    
public void off(){
        System.out.println(
"Light off.......");
    }

}

接着我们需要把命令封装成对象

public class LightOnCommand implements Command {
//开灯命令
    Light light;
    
    
public LightOnCommand(Light light){
        
this.light = light;
    }

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

}


public class LightOffCommand implements Command {
//关灯命令
    Light light;
    
public LightOffCommand(Light light){
        
this.light = light;
    }

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


}

设定使用命令的方式

public class SimpleRemoteControl {
    Command slot;
    
    
public SimpleRemoteControl(){}
    
    
public void setCommand(Command command) {
        slot 
= command;
    }

    
    
public void buttonWasPressed() {
        slot.execute();
    }

}

测试一下开灯,关灯

public class RemoteControlTest {

    
public static void main(String[] args) {
        SimpleRemoteControl remote 
= new SimpleRemoteControl();
        Light light 
= new Light();
        LightOnCommand lightOn 
= new LightOnCommand(light);
        
        remote.setCommand(lightOn);
        remote.buttonWasPressed();
        
        LightOffCommand lightOff 
= new LightOffCommand(light);
        remote.setCommand(lightOff);
        remote.buttonWasPressed();
    }


}

命令模式也可以用于撤消一系列的命令

我们应当记录下一系列的命令操作

public class RemoteControl {
    
//记录开和关的命令
    Command[] onCommands;
    Command[] offCommands;
    
    
public RemoteControl() {
        onCommands 
= new Command[7];
        offCommands 
= new Command[7];
        
        Command noCommand 
= new NoCommand();
        
for(int i = 0; i < 7 ; i++) {
            onCommands[i] 
= noCommand;
            offCommands[i] 
= noCommand;
        }

    }

    
    
public void setCommand(int slot, Command onCommand, Command offCommand){
        onCommands[slot] 
= onCommand;
        offCommands[slot] 
= offCommand;
    }

    
    
public void onButtonWasPushed(int slot) {
        onCommands[slot].execute();
    }

    
    
public void offButtonWasPushed(int slot) {
        offCommands[slot].execute();
    }

    
    
public String toString(){
        StringBuffer stringBuff 
= new StringBuffer();
        stringBuff.append(
" --------Remote Control------- ");
        
for(int i = 0; i < onCommands.length; i++) {
            stringBuff.append(
"[slot" + i + "]" + onCommands[i].getClass().getName()
                    
+ "    " + offCommands[i].getClass().getName() + " ");
        }

        
return stringBuff.toString();
    }

}

在这里 发现每次设置命令都应当判断此处是否已经存在命令。但是每次都判断比较烦琐
所以:

public class NoCommand implements Command {

    @Override
    
public void execute() {
        
// TODO Auto-generated method stub

    }


}

确保每个插槽都有一个命令对象。

然后需要给Command接口中加入撤消操作的方法

public interface Command {
    
public void execute();
    
public void undo();
}

并且在所有具体的命令中实现这个方法。

public class LightOnCommand implements Command {
    Light light;
    
    
public LightOnCommand(Light light){
        
this.light = light;
    }

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

    
//灯开以前的操作是关闭
    public void undo() {
        light.off();
    }

}

重新设计一个控制台

public class RemoteControlWithUndo {
    
//记录开和关的命令
    Command[] onCommands;
    Command[] offCommands;
    
//记录上一步的命令是什么
    Command undoCommand;
    
    
public RemoteControlWithUndo() {
        onCommands 
= new Command[7];
        offCommands 
= new Command[7];
        
        Command noCommand 
= new NoCommand();
        
for(int i = 0; i < 7 ; i++) {
            onCommands[i] 
= noCommand;
            offCommands[i] 
= noCommand;
        }

        undoCommand 
= noCommand;
    }

    
    
public void setCommand(int slot, Command onCommand, Command offCommand){
        onCommands[slot] 
= onCommand;
        offCommands[slot] 
= offCommand;
    }

    
    
public void onButtonWasPushed(int slot) {
        onCommands[slot].execute();
        
//记录这一步的命令是来自哪个插槽
        undoCommand = onCommands[slot];
    }

    
    
public void offButtonWasPushed(int slot) {
        offCommands[slot].execute();
        
//记录这一步的命令是来自哪个插槽
        undoCommand = offCommands[slot];
    }

    
//按下undo的时候,执行undo方法
    public void undoButtonWasPushed() {
        undoCommand.undo();
    }

    
public String toString(){
        StringBuffer stringBuff 
= new StringBuffer();
        stringBuff.append(
" --------Remote Control------- ");
        
for(int i = 0; i < onCommands.length; i++) {
            stringBuff.append(
"[slot" + i + "]" + onCommands[i].getClass().getName()
                    
+ "    " + offCommands[i].getClass().getName() + " ");
        }

        
return stringBuff.toString();
    }

}

测试一下undo

public class RemoteLoader {

    
public static void main(String[] args) {
        RemoteControlWithUndo remoteControl 
= new RemoteControlWithUndo();
        
        Light livingRoomLight 
= new Light("Living Room");
        Light kitchenLight 
= new Light("Kitchen");
        
        LightOnCommand livingRoomLightOn 
= new LightOnCommand(livingRoomLight);
        LightOffCommand livingRoomLightOff 
= new LightOffCommand(livingRoomLight);
        
        LightOnCommand kitchenLightOn 
= new LightOnCommand(kitchenLight);
        LightOffCommand kitchenLightOff 
= new LightOffCommand(kitchenLight);
        
        
        remoteControl.setCommand(
0, livingRoomLightOn, livingRoomLightOff);
        remoteControl.setCommand(
1, kitchenLightOn, kitchenLightOff);
        
        System.out.println(remoteControl);
        
        remoteControl.onButtonWasPushed(
0);
        remoteControl.offButtonWasPushed(
0);
        
        remoteControl.undoButtonWasPushed();
        
        remoteControl.onButtonWasPushed(
1);
        remoteControl.offButtonWasPushed(
1);
        
        remoteControl.undoButtonWasPushed();
    }


}

这种模式更多的被应用在队列请求和日志中
比如当系统发生异常的时候,我们可以根据日志来要求事务的回滚,回到原先正常的状态。

FPGA/IC秋招经典100题(含详解) FPGA/IC秋招笔试面试经典100题(含答案及详解),持续更新。。。 阅读详情

相关推荐

农业杂草检测——棉花杂草数据集

然后将本层13×13的特征图谱经过×2上采样扩充到26×26,并与上层中26×26的特征图谱拼接,得到新的26×26的特征图谱,在该特征尺度上进行第二次预测,此时得到的特征图谱是相对输入图像16倍下采样,具有中尺度感受野,适合检测中等尺度对象;通过目标检测,能够及时清除杂草,减少病虫害的滋生和传播,保障棉花的健康生长,并有助于降低生产成本。对于地膜覆盖的棉田,由于膜内耕作层土温高、底墒好,杂草出苗早而集中,一般覆膜后5 - 7天杂草陆续出土,在墒情好的情况下,15天左右即形成出土高峰。

qq_38220914的博客 1247

命令模式(CommandPattern)

定义 将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。其别名为动作(Action)模式或事务(Transaction)模式。 结构图 角色与理解 命令模式包含如下角色: Command(抽象命令类):所有具体命令类的父类,一般定义为抽象类或者接口,声明执行请求的execute()方法等。 Concrete Command(具体命令类):继承抽象命令类,持有接收者的引用,在execute()等方法中调用接收者的方法已

码农架构 505

Ubuntu下用QEMU模拟运行OpenBMC

在调试过程中,安装了很多依赖库,具体没有记录。关于kvm,也没理清具体有什么作用。本文仅记录,用QEMU成功的将OpenBMC跑起来的过程,做备忘,也供大家参考。

Sunny的博客 1206

CommandPattern-命令模式

角色: Command: 定义命令的统一接口 ConcreteCommand:Command接口的实现者,用来执行具体的命令 Receiver:命令的实际执行者 Invoker:命令的请求者,这个角色用来对各个命令进行控制 使用场景: 1 命令的发送者和命令执行者有不同的生命周期,命令发送了并不是立即执行 2 命令模式是对功能方法的抽象,不是对对象的抽象 3 命令模式是将功能提升到对象来操作,以便...

其实我也没有太多期盼,毕竟一生太短,少有圆满 230

告别糊涂账!用CKM3底表逻辑自建物料成本监控报表(含ABAP代码片段)

本文详细介绍了如何利用CKM3底表逻辑自建物料成本监控报表,解决标准报表无法穿透成本差异根源的问题。通过ABAP代码片段和四步架构法,帮助财务团队精准分析成本构成,优化成本核算批量处理,实现多维透视差异分析,提升成本监控效率。

weixin_30740295的博客 267

openeuler在线/离线安装docker服务

openeuler在线/离线安装docker服务

haixuti7的博客 1071

您的设计模式——命令模式【Command Pattern 】

今天讲命令模式,这个模式从名字上看就很简单,命令嘛,老大发命令,小兵执行就是了,确实是这个意思, 但是更深化了,用模式来描述真是是世界的命令情况。正在看这本书的你,我猜测分为两类:已经工作的和没有 工作的,先说没有工作的,那你为啥要看这本书,为了以后工作呗,只要你参加工作,你肯定会待在项目组,那 今天我们就以项目组为例子来讲述命令模式。 我是我们部门的项目经理,就是一个项目的头,在中国做项目

424

【ESP32 S3 开发】基于I2S协议驱动INMP441数字麦克风 实现语音采集

注意INMP441的 L/R接地之后才稳定输出数据 否则一直都是0WAV格式说明这里主要是想说wav文件重要的就是生成一个wavhead来标识它是一个wave文件,wave文件的data chunk 中的data部分还是PCM编码格式的数据,直接从I2S读进去就可以,不需要压缩。wav文件的头一般由4个chunk组成。 以16bit深度为例,代码如下。其他深度可以根据注释自行计算。 I2S -> DAC i2s_read()函数,向flash中划分的一个buff当中读入byte数组。以16bit深度为例,一

m0_43395703的博客 1万+

设计模式之命令模式

说实话这个模式挺令人纠结的,但从这个模式的定义上来看,有点让人摸不到什么头脑,而且查看资料以后会发现还是有点稀里糊涂的,说懂了吧也很简单,也不懂吧也有不懂的理由,于是查阅手头的各种书籍,在此写下心得体会,算是加深一下印象。 命令模式的定义:将请求封装成一个对象,从而让用户使用不同的请求把客户端参数化,以及支持可撤销和恢复的功能。 从定义上来看着实令人一脸懵逼,在这里描述一下博主个人的理解:

菜鸟博客 2万+

PyTorch深度学习实战(1)——神经网络与模型训练过程详解

在本节中,我们将了解传统机器学习与人工神经网络间的差异,并了解如何在实现前向传播之前连接网络的各个层,以计算与网络当前权重对应的损失值;实现反向传播以优化权重达到最小化损失值的目标。并将实现网络的所有关键组成——前向传播、激活函数、损失函数、链式法则和梯度下降,从零开始构建并训练了一个简单的神经网络。

盼小辉丶的博客 9万+

数据中台:大数据平台,数据仓库(DM),数据中台之间的联系以及异同分析

大数据平台是一个技术平台。这个技术平台提供了对于大数据的分布式采集,存储,流处理和计算,实时分析等能力。在没有大数据平台前也有数据集成和管理的平台,这种平台可以实现对结构化数据本身的采集,集成和管理。 管理平台,是在原生的大数据生态的基础之上,为了更好的管理集群服务,管理集群的资源,提供灵活SRE能力和资源核算审计能力的一系列工具和合称整体架构数据中台包括数据仓库的全部内容,数据仓库为数据中台提供了数据对外提供服务的基础资源,数据中台将数据仓库建设的投入价值进行最大化,以加快数据赋能业务的速度大家都知道数据

GIS摆渡人 2134

Unity 命令模式(实例详解)

在Unity中使用命令模式(Command Pattern)是一种常见的设计模式,用于实现对游戏或应用中一系列动作的记录、撤销和重做操作。接口以确保它们都能执行和撤销操作。在实际项目中,命令管理器会存储这些命令并根据需要执行撤销/重做功能。这些示例展示了如何定义不同的命令,并且每个命令都实现了。

qqrrjj2011的博客 1983

2、稳定性问题全景图——死机、重启、ANR、Crash、黑屏五大类

当 Crash 发生在 system_server、surfaceflinger、mediaserver 等关键系统进程中时,其后果等同于系统级故障,可能触发 Zygote 重启甚至 kernel panic。这类问题在稳定性治理中的优先级应等同于 P0。

woailuojp的博客 49

命令模式【Command Pattern 】

幸福就是回来看书,看自己想看的书。   博客地址  http://blog.youkuaiyun.com/ftx2540993425   下面横线以上内容是借鉴别人的,为了表达对作者的敬意,不做不恰当的修改,我个人的总结在后面。好的东西 今天讲命令模式,这个模式从名字上看就很简单,命令嘛,老大发命令,小兵执行就是了,确实是这个意思, 但是更深化了,用模式来描述真是是世界的命令情况。正在

菜鸟的飞翔 479

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

软件设计模式——命令模式

一、定义 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 二、作用 将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行...

JingHaiRoad Coder 449

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

命令模式(Command Pattern)

    命令模式属于对象的行为模式。命令模式又称为行动模式或交易模式。命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。     命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。每一个命令都是一个操作:请求的一方发出请求要求执行一个操...

qq_26880671的博客 206

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

命令模式CommandPattern

概念 命令模式:把一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间的松耦

chengmaoning的专栏 629

设计模式命令模式(CommandPattern)

核心模块:抽象命令类、具体命令类、命令接收者、调用者 所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git 使用场景:不知道请求的接收者,不知道请求的操作,主要封装不同的命令,可以使用这种松耦合的方式; 优点:低耦合度,新的命令很容易添加到系统,支持undo和redo操作,和命令队列; 缺点:如果命令过多导

didiao11300的专栏 270

java中命令模式详解和使用方法

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 介绍 意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。 主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。 何时使用:在某些场合,比如要对行为进行

lzjxiaoguang的博客 833

命令模式 CommandPattern

using System; using System.Collections; class Controller { ArrayList CommandList; public Controller() { CommandList = new ArrayList(); } public void addCommand(IComma

GhostHouse 1252

设计模式-命令模式

命令模式 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 模式结构 command:定义命令的接口,声明执行的方法。 concretecommand:命令接口实现对象,是“虚”的实现,永昌汇持有接收者,并调用接受者的功能来完...

小码农一枚 266
上一篇: 简单工厂模式,工厂模式,抽象工厂模式
下一篇: maven添加struts2-core 2.0.8依赖的时候,报错的解决办法
luhao
博客等级 码龄26年 9粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值