第十六章 命令模式

news2024/12/24 11:26:41

文章目录

  • 前言
  • 一、命令模式解决智能生活项目
    • 设计思想
    • 完整代码
    • Command 所有命令的父接口(绑定命令都需要实现)
    • LightReceiver 命令接受者
    • LightOnCommand / LightOffCommand 将具体的命令进行绑定
    • 空命令
    • 命令调用者
    • Clint 测试
  • 添加新的命令,非常简单
    • 添加命令接受者 TVReceiver
    • 将具体的命令进行绑定 TVOnCommand / TVOffCommand
    • Clint 测试
  • 二、命令模式在Spring框架JdbcTemplate应用的源码分析
  • 三、命令模式的注意事项和细节


前言

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


一、命令模式解决智能生活项目

在这里插入图片描述
在这里插入图片描述

设计思想

命令模式的设计思想是将命令统一管理,调用者并不需要关心谁会去执行命令,只需要发出命令或撤回命令,命令有具体对应的类,比如上面的类图,clint 只需要调用 RemoteController 传入两个 需要初始化的按钮 LightOn 和 LightOff ,对这两个按钮发送命令,命令的具体执行不需要关心,就可以达到开灯或者关灯的操作,也可以通过设置的撤销按钮进行 操作的撤销。

完整代码

Command 所有命令的父接口(绑定命令都需要实现)

package tanchishell.SJMS.command;

//创建命令接口
public interface Command {

    //执行动作(操作)
    public void execute();
    //撤销动作(操作)
    public void undo();
}

LightReceiver 命令接受者

package tanchishell.SJMS.command;

public class LightReceiver {

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

LightOnCommand / LightOffCommand 将具体的命令进行绑定

package tanchishell.SJMS.command;

//开灯  操作为开灯,撤销为关灯
public class LightOnCommand implements Command {

    //聚合 LightReceiver
    LightReceiver light;

    //构造器
    public LightOnCommand(LightReceiver light) {
        super();
        this.light = light;
    }




    @Override
    public void execute() {
        //调用接收者的方法
        light.on();
    }

    @Override
    public void undo() {

        //调用接收者的方法
        light.off();
    }
}

package tanchishell.SJMS.command;

//关灯  操作为关灯,撤销为开灯
public class LightOffCommand implements Command {

    // 聚合 LightReceiver
    LightReceiver light;

    // 构造器
    public LightOffCommand(LightReceiver light) {
        super();
        this.light = light;
    }

    /**
     *  关闭灯光命令类和打开灯光命令类的 方法调用正好相反
     */


    @Override
    public void execute() {

        // 调用接收者的方法
        light.off();
    }

    @Override
    public void undo() {

        // 调用接收者的方法
        light.on();
    }
}

空命令

package tanchishell.SJMS.command;

/**
 *  没有任何命令,即空执行: 用于初始化每个按钮, 当调用空命令时,对象什么都不做
 *  其实,这样是一种设计模式, 可以省掉对空判断
 */

public class NoCommand implements Command{
    @Override
    public void execute() {

    }

    @Override
    public void undo() {

    }
}

命令调用者

package tanchishell.SJMS.command;

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();
        }
    }

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

    // 按下开按钮
    public void onButtonWasPushed(int no) { // no 0
        // 找到你按下的开的按钮, 并调用对应方法
        onCommands[no].execute();
        // 记录这次的操作,用于撤
        undoCommand = onCommands[no];
    }

    // 按下开按钮
    public void offButtonWasPushed(int no) { // no 0
        // 找到你按下的关的按钮, 并调用对应方法
        offCommands[no].execute();
        // 记录这次的操作,用于撤销
        undoCommand = offCommands[no];
    }

    // 按下撤销按钮
    public void undoButtonWasPushed() {
        undoCommand.undo();
    }
}

Clint 测试

package tanchishell.SJMS.command;

public class Client {
    public static void main(String[] args) {
        //使用命令设计模式,完成通过遥控器,对电灯的操作
        //创建电灯的对象(接受者)
        LightReceiver lightReceiver = new LightReceiver();
        //创建电灯相关的开关命令
        LightOnCommand lightOnCommand = new LightOnCommand(lightReceiver);
        LightOffCommand lightOffCommand = new LightOffCommand(lightReceiver);
        //需要一个遥控器
        RemoteController remoteController = new RemoteController();
        //给我们的遥控器设置命令, 比如 no = 0 是电灯的开和关的操作
        remoteController.setCommand(0, lightOnCommand, lightOffCommand);
        System.out.println("--------按下灯的开按钮-----------");
        remoteController.onButtonWasPushed(0);
        System.out.println("--------按下灯的关按钮-----------");
        remoteController.offButtonWasPushed(0);
        System.out.println("--------按下撤销按钮-----------");
        remoteController.undoButtonWasPushed();
    }
}


输出

--------按下灯的开按钮-----------
 电灯打开了.. 
--------按下灯的关按钮-----------
 电灯关闭了.. 
--------按下撤销按钮-----------
 电灯打开了.. 

添加新的命令,非常简单

添加命令接受者 TVReceiver

package tanchishell.SJMS.command;

public class TVReceiver {

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

将具体的命令进行绑定 TVOnCommand / TVOffCommand

package tanchishell.SJMS.command;

public class TVOnCommand implements Command{

    // 聚合 TVReceiver
    TVReceiver tv;
    // 构造器
    public TVOnCommand(TVReceiver tv) {
        super();
        this.tv = tv;
    }
    @Override
    public void execute() {

        // 调用接收者的方法
        tv.on();
    }
    @Override
    public void undo() {

        // 调用接收者的方法
        tv.off();
    }
}

package tanchishell.SJMS.command;

public class TVOffCommand implements Command {
    // 聚合 TVReceive
    TVReceiver tv;

    // 构造器
    public TVOffCommand(TVReceiver tv) {
        super();
        this.tv = tv;
    }

    @Override
    public void execute() {

        // 调用接收者的方法
        tv.off();
    }

    @Override
    public void undo() {

        // 调用接收者的方法
        tv.on();
    }
}

Clint 测试

在这里插入图片描述

package tanchishell.SJMS.command;

public class Client {
    public static void main(String[] args) {
        //使用命令设计模式,完成通过遥控器,对电灯的操作
        //创建电灯的对象(接受者)
        LightReceiver lightReceiver = new LightReceiver();
        //创建电灯相关的开关命令
        LightOnCommand lightOnCommand = new LightOnCommand(lightReceiver);
        LightOffCommand lightOffCommand = new LightOffCommand(lightReceiver);
        //需要一个遥控器
        RemoteController remoteController = new RemoteController();
        //给我们的遥控器设置命令, 比如 no = 0 是电灯的开和关的操作
        remoteController.setCommand(0, lightOnCommand, lightOffCommand);
        System.out.println("--------按下灯的开按钮-----------");
        remoteController.onButtonWasPushed(0);
        System.out.println("--------按下灯的关按钮-----------");
        remoteController.offButtonWasPushed(0);
        System.out.println("--------按下撤销按钮-----------");
        remoteController.undoButtonWasPushed();



        System.out.println("=========使用遥控器操作电视机==========");
        TVReceiver tvReceiver = new TVReceiver();
        TVOffCommand tvOffCommand = new TVOffCommand(tvReceiver);
        TVOnCommand tvOnCommand = new TVOnCommand(tvReceiver);
        //给我们的遥控器设置命令, 比如 no = 1 是电视机的开和关的操作
        remoteController.setCommand(1, tvOnCommand, tvOffCommand);


        System.out.println("--------按下电视机的开按钮-----------");
        remoteController.onButtonWasPushed(1);
        System.out.println("--------按下电视机的关按钮-----------");
        remoteController.offButtonWasPushed(1);
        System.out.println("--------按下撤销按钮-----------");
        remoteController.undoButtonWasPushed();
    }
}


输出

=========使用遥控器操作电视机==========
--------按下电视机的开按钮-----------
 电视机打开了.. 
--------按下电视机的关按钮-----------
 电视机关闭了.. 
--------按下撤销按钮-----------
 电视机打开了.. 

二、命令模式在Spring框架JdbcTemplate应用的源码分析

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

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

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

相关文章

【信息安全案例】——身份与访问安全(学习笔记)

&#x1f4d6; 前言&#xff1a;一位用户对计算机信息资源的访问活动中&#xff0c;首先必须拥有身份标识&#xff0c;通过该标识鉴别该用户的身份&#xff0c;进一步地&#xff0c;用户还应当具有执行所请求动作的必要权限&#xff0c;系统会验证并控制其能否执行对资源试图完…

Human Pose Regression with Residual Log-likelihood Estimation

Abstract 通过似然热图对输出分布进行建模的基于热图的方法在人体姿态估计领域占据主导地位。相比之下&#xff0c;基于回归的方法更有效&#xff0c;但效果较差。 在这项工作中&#xff0c;我们探索了最大似然估计&#xff08;MLE&#xff09;&#xff0c;以开发一种高效有…

基于朴素贝叶斯的垃圾邮件分类系统项目开发教程

项目资源下载 基于朴素贝叶斯的垃圾邮件分类系统源码 项目简介 本项目基于朴素贝叶斯算法来解决垃圾邮件分类问题&#xff0c;并使用混淆矩阵进行了验证&#xff0c;得到了非常好的准确率和召回率&#xff08;96%和97%&#xff09;。此外还开发了一个可视化的垃圾邮件分类系统…

前端通过ajax上传文件到七牛云

1. 从服务端获取七牛云上传的token,生成token参考官方文档https://developer.qiniu.com/kodo/1208/upload-token 2. 在七牛云文档查找上传的存储区域 https://developer.qiniu.com/kodo/1671/region-endpoint-fq 在七牛云控制台找到空间管理的cdn加速域名https://portal.qiniu…

【Thinkphp 6】框架基础知识

文章目录 环境搭建框架基础规则继承引入单应用模式多应用模式自定义路由调试器空控制器 视图模板引擎安装渲染模板facade代理变量传递view.php语法查看编译后的文件默认值数组按键取值md5加密 请求request信息参数接收生成URL 文件上传上传及验证 验证功能验证器表单令牌 中间件…

android不可不知调试技巧

目录 1、条件断点 2、评估表达式&#xff08;Evaluate Expression&#xff09; 3、日志断点 4、方法断点 5、异常断点 6、Field WatchPoint 1、条件断点 假设我们列表循环的某个元素时候才暂停&#xff0c;就用这种方式。具体方式在循环列表打断点&#xff0c;对着断点右…

Nginx简介和快速入门

前言: 在一个小型的个人博客网站中&#xff0c;因为没什么流量&#xff0c;并发量小&#xff0c;一般可以直接在一个服务器上的tomcat中直接运行jar包.由tomcat直接响应给客户。 到后面之后随着流量的增大&#xff0c;一台服务器的资源不够用了&#xff0c;此时就需要再多开一…

浏览器渲染页面的原理及流程

1、渲染引擎首先通过网络获得所请求文档的内容 2、解析HTML文件&#xff0c;构建 DOM Tree 3、解析CSS&#xff0c;构建 CSSOM Tree(CSS规则树) 4、将 DOM Tree 和 CSSOM Tree合并&#xff0c;构建Render tree(渲染树) 5、reflow(重排、回流)&#xff1a;根据Render tree进行节…

功率器件的仿真评估

功率器件的仿真评估 1.功率器件仿真评估概述2.IGBT温升模型整理3.Matlab仿真计算4.仿真评估报告 1.功率器件仿真评估概述 功率器件的仿真评估共五个步骤&#xff1a; a.根据IGBT数据手册整理中热阻参数、开关损耗参数温升模型&#xff1b; b.带入到Matlab中仿真堵转、中速运行…

一键免费部署你的私人 ChatGPT 网页应用

主要功能 在 1 分钟内使用 Vercel &#xff08;https://vercel.com/&#xff09;免费一键部署精心设计的 UI&#xff0c;响应式设计&#xff0c;支持深色模式极快的首屏加载速度&#xff08;~100kb&#xff09;海量的内置 prompt 列表&#xff0c;来自中文和英文自动压缩上下文…

CUDA下载,以及下载GPU版本的pytorch

一、下载anaconda 因为这步我之前就下好了&#xff0c;主要参考这个链接&#xff1a;史上最全最详细的Anaconda安装教程 二、下载CUDA 1.首先观察自己需要什么版本的CUDA&#xff0c;以及是否安装过CUDA 先cmd&#xff0c;输入命令 nvidia-smi结果如下&#xff0c;所以我们…

论文笔记:Hidden Markov Map MatchingThrough Noise and Sparseness

sigspatial 2009 1 方法介绍 1.0great circle和route距离 1.1 和ST-matching的比较 1.1.1 转移概率和观测概率 和同一年的ST-matching很类似&#xff0c;也是使用HMM来进行路网匹配论文笔记&#xff1a;Map-Matching for low-sampling-rate GPS trajectories&#xff08;ST…

【Redis7】Spring Boot集成Redis(重点:集成RedisTemplate)

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍Redis7 Spring Boot集成Redis&#xff0c;包括Jedis、lettuce、集成RedisTemplate、集群时一台master宕机&#xff0c;java报错的情况分析。 后续会继续分享Redis7和其他重要知识点总结&#xff0c;如果喜欢这篇文…

linux-02-软件安装-centos7配置jdk、tomcat、mysql、lrzsz、项目部署(Git、Maven)、shell脚本自动从git仓库获取项目更新★

文章目录 Linux-Day02课程内容1. 软件安装1.1 软件安装方式1.2 安装JDKshell脚本里写 cd命令不生效 1.3 安装Tomcat1.3.1 Tomcat安装好多方便的自定义命令:1.3.2 Tomcat进程查看1.3.3 防火墙操作1.3.4 停止Tomcat 1.4 安装MySQL1.4.1 MySQL安装1.4.2 MySQL启动1.4.3 MySQL登录1…

几何算法——7.Blending(倒角)的调研、设计及算法

几何算法——7.Blending&#xff08;倒角&#xff09;的调研、设计及算法 1 Parasolid的Blending1.1 关于Parasolid的BlendSurface1.2 Edge Blending1.2.1 Rolling-ball blends1.2.2 Variable rolling-ball blends1.2.3 Chamfers1.2.3.1 face offset chamfers1.2.3.2 apex-rang…

自学黑客/网络渗透,一般人我劝你还是算了

写在开篇 笔者本人 17 年就读于一所普通的本科学校&#xff0c;20 年 6 月在三年经验的时候顺利通过校招实习面试进入大厂&#xff0c;现就职于某大厂安全实验室。 我为啥说自学黑客&#xff0c;一般人我还是劝你算了吧。因为我就是那个不一般的人。 首先我谈下对黑客&…

AMBA总线协议AXI——学习笔记

文章目录 前言一、AXI&#xff08;Advanced eXtensible Interface&#xff09;1、定义2、信号2.1 全局信号2.2 写数据通路2.3 写地址通道2.4 写回复通道2.5 读数据通道2.6 读地址通道2.7 低功耗接口信号 3、AXI-Lite协议特点4、读写时序图4.1 读burst4.2 读重叠burst4.3 写burs…

Baklib母公司探码科技荣获甲子光年:2023中国AI数据平台创新企业

4月25日&#xff0c;由中国科技产业智库「甲子光年」主办、上海市信息服务业行业协会支持的「共赴山海2023甲子引力X智能新世代」峰会在上海召开。峰会上为了表彰在AI领域中取得卓越成就的公司&#xff0c;甲子光年在峰会现场颁布了星辰20&#xff1a;创新企业&#xff0c;表彰…

鹏程·盘古

鹏程盘古模型基于 1.1 TB 高质量中文训练数据&#xff0c;采用全场景人工智能计算框架 MindSpore 自动并行技术实现了五维并行训练策略&#xff0c;从而可将训练任务高效扩展到 4 096 个处理器上。 对比实验表明&#xff0c;在少样本或零样本情况下&#xff0c;鹏程盘古模型在…

Mysql高级知识-------索引

mysql索引的创建&#xff0c;新增&#xff0c;删除 查询索引&#xff1a; 语法&#xff1a; show index from 表 主要参数&#xff1a; 新建表中添加索引 ① 普通索引 create table t_dept( no int not null primary key, name varchar(20) null, sex varchar(2) null, inf…