Java设计模式(六)—— 命令模式

        命令模式定义如下:将一个请求封装为一个对象,从而使用户可用不用的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

适合命令模式情景如下:

  • 程序需要在不同的时刻指定、排列和执行请求
  • 程序需要提供撤销操作
  • 程序需要提供宏操作

一、问题的提出

        顾名思义,命令模式一定有命令发送者、命令接收者。命令发送者负责发送命令;命令接收者负责接收命令并完成具体的工作 。例如:老师通知学生打扫卫生,老师是命令发送者,学生是命令接收者。当学生接到命令后,完成分担区的清扫工作。

二、命令模式

        命令模式主要针对需要执行的任务用户提出的请求进行封装和抽象。抽象的命令接口描述了任务或请求的共同特征,而实现则交由不同的具体命令对象完成。每个命令对象都是独立的,它负责完成需要执行的任务,却并不关心是谁调用它。

命令模式中四种角色:

  • ICommander:抽象命令者,是一个接口,规定了用来封装请求的若干方法。
  • ConcreteCommander:命令具体发送者
  • Invoker:请求者
  • Reveiver:命令接收者

        考虑老师通知学生打扫卫生的程序描述,具体代码如下:

(1)抽象命令接口

public interface ICommand {
    public void sweep();
}

(2)命令接受者Student

在命令模式中,具体工作一定是在接收者中完成的,这一点非常重要。

public class Student {
    public void sweep() {
        System.out.println("学生正在打扫卫生...");
    }
}

(3)命令发送者Teacher

命令发送者类中一般来说,包含命令接收者的引用,表名发送命令的目的地址。所以在Teacher类中定义了接收者Student类对象的引用。

public class Teacher implements ICommand{

    private Student receiver = null;

    //把传入的Student对象赋值给它的成员变量reveiver
    public Teacher(Student receiver) {
        this.receiver = receiver;
    }

    @Override
    public void sweep() {
        //调用学生的sweep方法进行打扫
        receiver.sweep();
    }
}

(4)命令请求者类Invoke

public class Invoke {
    
    ICommand command;

    public Invoke(ICommand command) {
        this.command = command;
    }
    public void execute() {
        command.sweep();
    }
}

普通思路:

命令发送者——>命令接收者

在普通思路中,命令发送者直接作用命令接收者

命令模式思路:

命令发送者——>命令请求者——>命令接收者

在命令模式思路中,在两者之间增加了一个请求者类,命令发送者先于命令请求者交互,请求者再和命令接收者交互。在此过程中,请求者起到了一个桥梁的作用。 

(5)测试类

        测试类中,创建命令发送者对象(Teacher),命令请求者对象(Invoke),命令接收者对象(Student)。 

public class Test {
    public static void main(String[] args) {
        Student student = new Student();
        Teacher teacher = new Teacher(student);
        //教师对象是命令,将命令请求加到请求者对象中
        Invoke invoke = new Invoke(teacher);
        invoke.execute();
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

java基础知识——12.小练习

这篇文章就是主要做一些算法小练习用的 1.求机票价格 题目如下: 需求:机票价格按照淡旺季,头等舱经济舱来收费。输入机票原价,淡旺季,头等舱或经济舱来获取机票价格 规则如下:旺季(5-10&…

【 Bean 作⽤域和⽣命周期 】

文章目录引用一、认识 Bean的作用域二、作⽤域定义三、Bean 的 6 种作⽤域四、Bean 原理分析4.1 Bean 执行流程4.2 Bean ⽣命周期引用 从前⾯的课程我们可以看出 Spring 是⽤来读取和存储 Bean,因此在 Spring 中 Bean 是最核⼼的操作资源,所以接下来我们…

你真的会写 git commit message 吗?

作者:明明如月学长, CSDN 博客专家,蚂蚁集团高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《EffectiveJava》独家解析》专栏作者。 热门文章推荐…

用GPT-4写代码不用翻墙了?Cursor告诉你:可以~~

目录 一、介绍 二、使用方法 三、其他实例 1.正则表达式 2.自动化测试脚本 3.聊聊技术 一、介绍 Cursor主要功能是根据用户的描述写代码或者进行对话,对话的范围仅限技术方面。优点是不用翻墙、不需要账号。Cursor基于GPT模型,具体什么版本不祥&#…

Powershell脚本自动化登录网站的简单实例,命令行方式实现Http(s)的GET、POST请求

自动化登录网站的流程比较简单,如果不懂 Python、JavaScript、C 等编程语言,又没有安装这些编程语言环境软件,我们还要新的点子:用Windows系统自带的 Powershell 运行自编的脚本来实现。 PowerShell 是一种功能强大的自动化工具&…

大型软件外包项目的开发流程

与中小型软件项目相比,大型软件项目的管理和开发难度更大,需要在开发过程中严格执行软件的项目管理流程,不能有比较明显的问题,有问题也要及时解决。软件项目的开发过程环环相扣,如果在前流程中有明显问题,…

【fluent UDF】保留UDM变量Reserving UDM Variables Using Reserve_User_Memory_Vars-测试分析篇

一、问题背景 因为对Reserve_User_Memory_Vars这个函数比较陌生,在学习官方文档过程中发现难以理解,于是只好亲手在fluent 2022上测试一番。 直接上结论: 此保留函数运行一次后(设置GUI界面中的UDM数目第一次加载共享库成功&…

【从零开始学习 UVM】3.8、UVM TestBench架构 —— UVM Agent [uvm_agent]

文章目录 什么是 UVM Agent?所有的Agent Type是什么?如何确定UVM Agent是主动还是被动的?创建UVM代理的步骤一个UVM代理做什么?如何将UVM代理配置为主动或被动?一个UVM Agent例子推荐做法什么是 UVM Agent? 一个 Agent 将Sequencer、Driver和Monitor封装成一个单一实体,…

图像分类的划分数据,dataset和dataloader的实现

目录 1. 介绍 2. 主函数代码 2. utils 模块代码 2.1 划分数据集 2.2 可视化数据集 3. dataset 数据处理 4. collate_fn 5. other 1. 介绍 图像分类一般来说不需要自定义的dataSet,因为pytorch自定义好的ImageFolder可以解决大部分的需求,更多的…

springBoot --- mybatisPlus自动生成代码

mybatisPlus自动生成代码mybatisPlus自动生成代码pom.xmlapplication.yml自动生成代码测试主启动类生成目录结果使用插件 --- 版本要求:3.4.0 版本以上pom.xml更新mybatisplus插件版本mp报错‘AutoGenerator()‘ has private access in ‘com.baomidou.mybatisplus.…

Linux系统中使任务后台挂起不停止的命令

在使用远程SSH连接工具时,退出工具时任务也停止,相当于远程连接工具在系统开启了一个Terminal终端,服务也会随着终端的中断而停止。Linux系统也提供了服务基于后台运行的命令,是独立于终端的进程。 nohup Linux nohup Linux no…

【Python】仅7行代码实现自动化天气报时

文章目录前言一、实现步骤二、请求天气接口1.引入库2.读入数据3.钉钉通知天气预报总结前言 早上出门上班前,我总是忘记查看天气预报,以至于通勤路上下雨来了个措手不及。 回想起来,大部分人早上出门前的行为模式是固定的,那么有…

一个基于stream的EPICS IOC应用程序

本文将介绍如何开发一个基于stream的EPICS IOC应用程序,其将作为一个简单的基于消息的设备(用于EPICS stream练习的设备模拟程序_yuyuyuliang00的博客-CSDN博客中最后一个python程序模拟的设备)的IOC控制程序。 1) 按如下步骤建立这个IOC程序…

vb+access大气污染模型系统

数据模型就是按专业的要求,用数字方式描述自然界的事物或现象以及他们的关系。 我们通过对地区的具体数值和情况的观察,对大气质量状况做出分析,建立一个符合当地情况的大气污染模型,用来测量大气污染浓度,并根据污染…

在公司兢兢业业5年,被新来的自动化测试倒挂了薪资…

去年年中朋友左思右想从工作了 5 年的企业离职,离职原因很简单,待疲了,薪资也没咋涨过,新来的自动化测试钱比 Ta 高一倍。但离职 Ta 还是很忐忑的,在这个公司待得久了,自己会的东西一直是那些,业…

Python3爬虫图片抓取

在上一章中,我们已经学会了如何使用Python3爬虫抓取文字,那么在本章教程中,将通过实例来教大家如何使用Python3爬虫批量抓取图片。注:该网站目前已经更换了图片的请求方式,以下爬虫方法只能作为思路参考,已…

【Linux】进程理解与学习-程序替换

环境:centos7.6,腾讯云服务器Linux文章都放在了专栏:【Linux】欢迎支持订阅 相关文章推荐: 【Linux】冯.诺依曼体系结构与操作系统 【Linux】进程理解与学习Ⅰ-进程概念 【Linux】进程理解与学习Ⅱ-进程状态 【Linux】进程理解与学…

想拿到10k-40k的offer,这些技能必不可少!作为程序员的你了解吗

总结了一份Java架构师的技能树,希望对Java编程的同学有点帮助 Java编程的技术点: ​ 计算机基础 ​ Java高级特性 设计模式 ​ 数据库 分布式系统 ​ 注意:下文主要是我个人的总结方法经验(面试学习和刷题笔记) 01…

aws codedeploy 在ec2实例和autoscaling组上进行蓝绿部署

参考资料 https://docs.amazonaws.cn/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.htmlhttps://docs.amazonaws.cn/zh_cn/codedeploy/latest/userguide/applications.html为 EC2/本地蓝/绿部署创建部署组(控制台) 部署ec2比较…

面试角度看问题:消息队列详解(万字长文,绝对值得一看)

面试角度看问题:消息队列详解前言一、消息队列是什么?二、为什么要使用消息队列?1.解耦2.异步3.削峰三、消息队列有什么缺点?1.系统可用性降低2.系统复杂度提高3.一致性问题四、如何保证消息队列的高可用?1.RabbitMQ 的…
最新文章