命令模式的学习

【电子元件篇】MOSFET场效应管作用、选型和测量指南-超简单解读 场效应管是一种电压控制型半导体器件,相比三极管具有输入阻抗高、噪声小、功耗低等优势。主要分为结型和绝缘栅型两大类,后者又可分为耗尽型和增强型MOS管。场效应管通过栅极电压控制漏极电流,具有转移特性和输出特性两大静态特性,以及快速的开关特性。其关键参数包括饱和漏源电流、夹断电压、跨导等,应用场景涵盖信号放大、恒流源、阻抗变换等领域。使用时需根据电路需求选择合适类型,如结型管适合一般放大,功率MOSFET适合高压大电流场合。检测时可用万用表电阻档初步判断好坏和放大能力。 阅读详情

智能生活需求:

​  每个品牌都有着各自的智能家居。而你想操作不同牌子的智能家居只能通过不同品牌的App进行控制。

​  我们能否通过一个App就可以控制全部的智能家居。这便要求每个智能家具厂家提供一个统一接口给App调用。

 

命令模式

​  在软件设计中,经常需要向某些对象发生请求,但是并在不知道接收者是谁,也不知道被请求的操作是哪个,那么我们只需要在程序运行时指定具体的请求接收者即可。

​  它可将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中, 且能实现可撤销操作。
 

命令模式结构

在这里插入图片描述

 1.发送者 (Sender)/“触发者 (Invoker)”类负责对请求进行初始化, 其中必须包含一个成员变量来存储对于命令对象的引用。 发送者触发命令, 而不向接收者直接发送请求。 注意, 发送者并不负责创建命令对象: 它通常会通过构造函数从客户端处获得预先生成的命令。

 2.命令 (Command) 接口通常仅声明一个执行命令的方法。

 3.具体命令 (Concrete Commands)会实现各种类型的请求。 具体命令自身并不完成工作, 而是会将调用委派给一个业务逻辑对象。 但为了简化代码, 这些类可以进行合并。

 接收对象执行方法所需的参数可以声明为具体命令的成员变量。 你可以将命令对象设为不可变, 仅允许通过构造函数对这些成员变量进行初始化

 4.接收者(Recriver)类包含部分逻辑。几乎所有对象都可以作为接收者。绝大部分命令只处理如何将请求传递给接收者的细节,接收者则会自己完成实际的工作。

 5.客户端(Client)会创建并配置具体命令对象。客户端必须将包括接收者实体在内的所有请求参数传递给命令的构造函数。此后,生成的命令就可以与一个或多个发送者相关联了。
 

命令模式适合应用场景

 1.如果你需要通过操作来参数化对象, 可使用命令模式。

 2.如果你想要将操作放入队列中、 操作的执行或者远程执行操作, 可使用命令模式。

 3.如果你想要实现操作回滚功能, 可使用命令模式。

 

实现方式

  1. 声明仅有一个执行方法的命令接口。

  2. 抽取请求并使之成为实现命令接口的具体命令类。 每个类都必须有一组成员变量来保存请求参数和对于实际接收者对象的引用。 所有这些变量的数值都必须通过命令构造函数进行初始化。

  3. 找到担任发送者职责的类。 在这些类中添加保存命令的成员变量。 发送者只能通过命令接口与其命令进行交互。 发送者自身通常并不创建命令对象, 而是通过客户端代码获取。

  4. 修改发送者使其执行命令, 而非直接将请求发送给接收者。

  5. 客户端必须按照以下顺序来初始化对象:

    5.1创建接收者。

    5.2创建命令, 如有需要可将其关联至接收者。

    5.3创建发送者并将其与特定命令关联。

 

命令模式优缺点

 优点:

  ✔️ 单一职责原则。 你可以解耦触发和执行操作的类。

  ✔️ 开闭原则。 你可以在不修改已有客户端代码的情况下在程序中创建新的命令。

  ✔️ 你可以实现撤销和恢复功能。

  ✔️ 你可以实现操作的延迟执行。

  ✔️ 你可以将一组简单命令组合成一个复杂命令。

 缺点:

  ❌ 代码可能会变得更加复杂, 因为你在发送者和接收者之间增加了一个全新的层次。

 

解决智能生活需求

在这里插入图片描述

代码

//指令
public interface Command {
    //执行动作
    public void execute();
    //撤回动作
    public void undo();
}
//控制者
public class RemoteController {
    //开关 按钮的命令数组
    Command[] onCommands;
    Command[] offCommands;

    //执行撤销的指令
    Command undoCommand;

    RemoteController(){
        onCommands = new Command[5];
        offCommands = new Command[5];

        //首先赋予空指令
        for (int i = 0; i < 5; i++) {
            onCommands[i] = new NoCommand();
            offCommands[i] = new NoCommand();
        }
    }

    //给予按钮设置你需要的命令
    public void setCommand(int index,Command onCommand,Command offCommand){
        onCommands[index] = onCommand;
        offCommands[index] = offCommand;
    }

    //按下开的按钮
    public void onButtoWasPushed(int index){
        //找到你按下的开按钮
        onCommands[index].execute();
        //记录这次行为,便于撤销
        undoCommand = onCommands[index];
    }

    //按下关的按钮
    public void offButtonWasPushed(int index){
        //找到你按下的关按钮
        offCommands[index].execute();
        //记录这次行为,便于撤销
        undoCommand = offCommands[index];
    }


    //按下撤销按钮
    public void undoButtonWasPushed(){
        undoCommand.undo();
    }
}
//电灯类 接收者
public class LightReceiver {

    public void on(){
        System.out.println("电灯被打开了...");
    }

    public void off(){
        System.out.println("电灯被关闭了...");
    }
}

//电灯关闭指令
public class LightOffCommand implements Command {
    //聚合灯
    LightReceiver light;

    public LightOffCommand(LightReceiver light){
        super();
        this.light = light;
    }

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

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

//电灯开启指令
public class LightOnCommand implements Command {
    //聚合灯
    LightReceiver light;

    public LightOnCommand(LightReceiver light){
        super();
        this.light = light;
    }

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

    @Override
    public void undo() {
        light.off();
    }
}
//电视机
public class TVReceiver {
    public void on(){
        System.out.println("电视机被打开了...");
    }

    public void off(){
        System.out.println("电视机被关闭了...");
    }
}

public class TVoffCommand implements Command{
    private TVReceiver tv ;

    public TVoffCommand(TVReceiver tv) {
        this.tv = tv;
    }

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

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

public class TVOnCommand implements Command{
    private TVReceiver tv ;

    public TVOnCommand(TVReceiver tv) {
        this.tv = tv;
    }

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

    @Override
    public void undo() {
        tv.off();
    }
}
public class Client {
    public static void main(String[] args) {
        //创建接收者
        LightReceiver lightReceiver = new LightReceiver();

        //创建开关指令
        LightOnCommand on = new LightOnCommand(lightReceiver);
        LightOffCommand off = new LightOffCommand(lightReceiver);

        //创建控制者
        RemoteController rc = new RemoteController();

        //给控制者说明 第一排为灯泡的控制开关
        rc.setCommand(0,on,off);

        rc.onButtoWasPushed(0);

        rc.offButtonWasPushed(0);

        rc.undoButtonWasPushed();


        //电视机
        TVReceiver tv = new TVReceiver();
        rc.setCommand(1,new TVOnCommand(tv),new TVoffCommand(tv));

        rc.onButtoWasPushed(1);
        rc.offButtonWasPushed(1);
    }
}

命令模式的注意事项和细节

 1.将发起请求的对象与执行请求的对象解耦。发起请求的对 象 是 调 用者,调用者只要调用命令对象的 execute() 方法就可以让接收者工作,而不必知道具体的接收者对象是谁、是如何实现的,命令对象会负责让接收者执行请求的动作, 也就是说:请求发起者”和“请求执行者”之间的解耦是通过命令对象实现的,命令对象起到了纽带桥梁的作 用。
 2.容易 设 计一个命令队列。只要把命令对象放到列队 ,就 可以多线程的执行命 令
 3.容易实现对请求的撤销和重做
 4.命令模式不足:可能导致某些系统有过多的具体命令类,增加了系统的复杂 度这点在在使用的时候要注意
 5.空命令也是 一种设计模式,它为我们省去了判空的操作。在上面的实例中,如果没有用空命令,我们每按下一个按键都要判空,这给我们编码带来一定的麻烦 。
 6.命令模式经典的应用场景:界面的一个按钮都是一条命 令 、模拟CMD DOS 命令订单的撤销恢复、触发反馈机制

二、CANdelaStudio入门-版本介绍 本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的各个版本,欢迎各位朋友订阅、评论,可以提出宝贵意见,以持续输出更好的作品,同时会根据评论、私信不定期更新文章内容,以及专栏目录。订阅该专栏的朋友可私信小编免费答疑解惑(^U^)ノ~YOCANdelaStudio——诊断需求定义工具,诊断协议开发软件 ①用户以模板概念为导向 阅读详情

相关推荐

LabVIEW内存优化实战:用DVR和队列高效处理大型数组,告别数据副本

本文深入探讨LabVIEW内存优化技术,重点介绍数据值引用(DVR)和单元素队列(SEQs)在高效处理大型数组中的应用。通过对比传统方法与现代引用技术的性能差异,提供减少内存副本、提升程序效率的实战方案,帮助开发者在测试测量、图像处理等数据密集型场景中实现显著性能提升。

weixin_30835649的博客 1061

津津乐道设计模式 - 命令模式详解(以智能家居系统举例带你了解命令模式)

本章节主要介绍了命令模式、命令模式适用场景、命令模式的优缺点,并以智能家居系统举例模拟命令模式的使用方法,如果本文对你有用,欢迎关注收藏评论,后续将陆续推出贴切生活的搞笑讲解方式带大家一起学编程~

Micro麦可乐的博客 1万+

在已有win10系统下安装Ubuntu,最后出现执行‘grub-install/dev/nvme0n1p5‘失败的致命错误的解决方案

本人电脑型号戴尔灵越,两个SSD512G固态硬盘,c盘为系统盘. Ubuntu版本为20.04LTS,在官网下载https://ubuntu.com/download/desktop/thank-you?version=20.04.3&architecture=amd64 系统盘制作工具为Rufus-3.15http://rufus.ie/zh/ 安装过程网上很多,在这里就不赘述了. 其他安装过程都很顺利,直至安装最后出现这个 本来安装了到最后还以为成了,结果又不行...... 后.

XiaoChen_gugugu的博客 1万+

[设计模式] - 命令模式

文章目录一、命令模式简介1. 什么是命令模式2. 简单说明3. 代码实现 一、命令模式简介 1. 什么是命令模式 命令模式(Command Pattern) 属于行为性设计模式的一种,在<设计模式之禅>一书中其定义为: Encapsulate a request as an object ,thereby letting you parameterize clients with different request , queue or log requests ,and support und

xiaoai1994的博客 1143

基于Simulink的六旋翼无人机动力分配仿真建模示例

六旋翼无人机概述特点:高冗余度、增强的负载能力和更好的故障容忍性。关键组件电机与螺旋桨:提供升力和推力。电调(ESC):控制电机转速。IMU(惯性测量单元):包括加速度计和陀螺仪,用于姿态估计。飞控板:处理传感器数据并生成控制信号。应用场景:航拍摄影、农业监测、物流配送等。仿真目标搭建一个简化的六旋翼无人机动力分配模型,涵盖电机驱动、姿态控制及位置控制过程。分析不同条件下的性能指标(如响应时间、稳定性等),并探讨六旋翼无人机的设计优化。

xiaoheshang_123的博客 485

华为OD机试双机位C卷-虚拟文件系统(C/C++/Py/Java/Js/Go)

华为OD机试(机考)双机位C卷 【虚拟文件系统】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【虚拟文件系统】。

qq_45776114的博客 477

认真学习设计模式之命令模式(Command Pattern)

【1】命令模式 命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。命令模式又称为行动(Action)模式或交易(Transaction)模式。 命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式允许请求...

小小默:进无止境 1228

【短距离通信】【WiFi】精讲WiFi 6E协议!图解超赞超详细!!!

802.11ax(HE,HighEfficiency) (Wi-Fi 6E):6G频段共有1200MHz的频谱给到WiFi 6E使用,可用于从5.925GHz到7.125GHz。WiFi将可以访问59个20MHz信道,29个40MHz信道14个80MHz信道和7个160MHz信道。这不仅代表可以有很多频道,还可以代表可以解锁更高的数据速率。因为 802.11ax 标准(Wi-Fi 6)也在 2.4GHz 和 5GHz 频段运行,所以 6GHz 频段的 Wi-Fi 将被命名为 Wi-Fi 6E。

风云说通信 2345

Unity之C#学习笔记(18):命令模式 Command Pattern

前篇链接:Unity之C#学习笔记(17):对象池模式 Object Pooling 命令模式是一种行为型设计模式。通常,当对象A需要对象B做某件事时,是在A中直接调用B的函数实现,这个过程增加了A和B的耦合度。命令模式在这个过程中增加一个中间的抽象层,将A要求做某件事抽象封装为一个“命令”对象,A作为发出者只需发出命令,交由中间类处理,而无需知道具体接收者是谁,同理接收者也是接收来自中间类的命令,实现了命令发出者和接收者的解耦合。当然,代价就是增加了一个抽象层,使代码结构变得复杂。 命令模式有一个很实用的

アルタイル 908

GDB交叉编译与问题解决:从零到精通的深度指南

完成后,GDB会安装到/usr/local/gdb-aarch64/bin,可以用aarch64-linux-gnu-gdb --version检查。:得有支持目标架构的交叉编译工具链,比如gcc-arm-none-eabi(用于ARM裸机)或aarch64-linux-gnu-gcc(用于ARM Linux)。:在配置工具链时,运行aarch64-linux-gnu-gcc --version检查版本,确保工具链没问题。这种场景下用GDB调试,就像在荒野求生,但别慌,GDB依然是你的好伙伴。

大模型大数据攻城狮的专栏 1万+

【YOLOv8改进-卷积Conv】 SAConv(Switchable Atrous Convolution):可切换的空洞卷积

许多现代目标检测器通过采用二次观察和思考机制展示了卓越的性能。在本文中,我们在目标检测的主干设计中探索了这一机制。在宏观层面上,我们提出了递归特征金字塔(Recursive Feature Pyramid),该金字塔将特征金字塔网络(Feature Pyramid Networks)的额外反馈连接融入到底层的自下而上主干层中。在微观层面上,我们提出了可切换空洞卷积(Switchable Atrous Convolution),该卷积通过不同的空洞率卷积特征,并使用切换函数汇集结果。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 1528

设计模式学习--命令模式(Command Pattern)

设计模式学习--命令模式(Command Pattern) 2013年6月18日 设计模式学习记录 题外话:不知道同志们,怎么看待设计模式这个东西的,以小巫现在的水平,还不能把设计模式能运用到实际开发当中去,自己面向oo的设计思想还不够成熟,我知道设计模式是个好东西,只要能运用好就可以发挥很大的作用,但运用不好也会给项目带来麻烦,增加了复杂性。小巫觉得,刚学习设计模式的时候不应该有学完...

runfeel 316

番外篇 | 复现HIC-YOLOv5,助力小目标物体的检测

在本文中提出了一种改进的YOLOv5算法:HIC-YOLOv5,用于小目标检测,具有更好的性能和较低的计算成本。🌈

小哥谈 1130

Golang学习笔记_44——命令模式

命令模式是一种行为型设计模式,通过将请求封装为独立对象实现调用者与执行者的解耦,支持请求的队列化、撤销重做和事务管理。其核心特点包括:•请求对象化:将操作抽象为可传递的命令对象•解耦调用链:调用者无需了解具体执行细节•操作可编排:支持命令的组合与顺序控制。

LuckyLay的博客 1400

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

假人有限元模型

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

学习设计模式-命令模式(Command Pattern)

命令模式 定义 命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式支持可撤销的操作。 类图

提莫达达的博客 225

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

sublime命令模式学习

u010873358的博客 437

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

《游戏设计模式》学习笔记(二)命令模式 Command Pattern

采用命令模式后,我们将jump,fire这些方法做成一个抽象类command的子类,这样每个命令就有了面向对象的形式的封装(将命令变为数据对象,让这个对象和其他对象一样可以被存储和传递)2.对于不同的游戏角色,我们因为会往里边传入不同actor的引用,最后调用的是actor中内置的方法(如jump方法),这就实现了不同的角色拥有不同的按键行为。1.对于不同的按键,由于其类型都是command*,我们只需要让这个指针指向不同的子类命令对象,就可以实现按键配置功能了。这个时候我们就需要考虑使用命令模式了。

Currybeefer的博客 2238

JAVA设计模式学习笔记6——命令模式(Command Pattern)

命令模式(Command Pattern)——将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持科撤销的操作。     命令模式适用于“请求-响应”模式的功能,将用户的请求封装成对象(命令),用户需要执行什么样的操作,就调用什么样的命令,而无需知道命令的执行逻辑是什么。     命令模式主要包含以下几个概念: 1、Command:所有命令的抽象类,一般需...

why 423

HeadFirst 设计模式学习笔记6--命令模式

本文已搬家至【HeadFirst 设计模式学习笔记】6 命令模式

gnuhpc的专栏 3552

命令模式学习总结

目录 命令模式 引言 定义 模式结构图 模式分析 实例 实例描述 代码实现 模式扩展 命令模式实现撤销操作 宏命令 总结 模式优点 模式缺点 命令模式   引言 命令模式将请求发送者和请求接收者解耦,请求发送者通过命令对象间引用接收者,使得系统具有更好的灵活性,可以在不修改现有系统源代码的情况下将相同的发送者对应不同的接收者,也可以将多个命令组合成宏命令,可以再...

江川的博客 875

尚硅谷设计模式学习(15)---[命令模式(Command Pattern)]

尚硅谷传送门==>B站尚硅谷Java设计模式 ❤❤❤感谢尚硅谷❤❤❤ 最近开始计划学习一下设计模式了,加油!!! 目录命令模式 先看一个案例 买了一套智能家电,有照明灯、风扇、冰箱、洗衣机,只要在手机上安装app就可以控制对这些家电工作。这些智能家电来自不同的厂家,但是不想针对每一种家电都安装一个App,分别控制,希望只要一个app就可以控制全部智能家电。 看起来像是外观模式,但是又不一样,外观模式中是加一层接口后,在接口中定义几个方法;可以直接操控流程. 这里要实现一个app控制所有智能

从零开始的异世界JAVA学习 309

设计模式学习--16.命令模式(Command Pattern)

package com.designepattern.commandpattern; /** * @Date:2020/12/2 * @Content: */ public class MainDemo { public static void main(String[] args) { Command cmd=new CommandImpl(); Invoker inv=new Invoker(cmd); inv.exec(); ...

u010031813的博客 152

Java设计模式学习-命令模式

介绍 命令模式:将一个请求封装为一个对象 , 从而使我们可用不同的请求对客户端进行参数化 , 对请求排队或记录请求日志 , 以及支持可撤销的操作 。 也称之为 : 动作Action模式 , 事物transction模式 结构 Command 抽象命令类 ConcreteCommand 具体命令类 Invoker 调用者/请求者 -- 请求的发送者 , 它通过命令对象来执行请求 。一个调用...

NULL 246

学习笔记【23种设计模式-第十四节:Command Pattern 命令模式】

Command Pattern 命令模式 简述 命令模式,在软件设计中,我们经常需要向欧协对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计 命令模式使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦。 在明明模式中,会将一个请求封装为一个对象,以便使用不同参数来表示不同的请求(即命名),同时命令模式也支持可撤销的操作。 通俗易懂的理解:将军发布命令,士兵去执行。其中有几个

qq_53273362的博客 157

设计模式学习-简单的命令模式例子

上一章节介绍过了命令模式,这一篇文章就简单的做一个小案例来巩固学习。

m0_52021450的博客 807

学习设计模式《十二》——命令模式

命令模式的本质是【封装请求】

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1684
上一篇: 模板方法的学习
下一篇: 访问者模式
code_Floyed
博客等级 码龄7年 3粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值