研磨设计模式day12命令模式

目录

定义

几个参数

场景描述

代码示例

参数化设置

命令模式的优点

本质 

何时选用


定义

几个参数

Command:定义命令的接口。

ConcreteCommand:命令接口的实现对象。但不是真正实现,是通过接收者的功能来完成命令要执行的操作

Receiver:接收者。真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能

Invoker:要求命令对象执行请求,通常持有命令对象。

Client:创建具体的命令对象,并且设置命令对象的接收者。

场景描述

电脑开机:

机箱上的按钮就相当于是命令对象

机箱相当于是Invoker:要求机箱上的按钮执行哪些动作

主板相当于接收者对象:真正执行命令的对象

命令对象持有接收者对象就相当于按钮有一条线连接着主板,当按钮被按下就通过连接线把命令发出去。

代码示例

定义主板

package day12命令模式;/*** 主板的接口*/
public interface ZhuBanApi {/*** 定义一个功能:开机*/public void open();
}

定义实现,定义两个一个是技嘉主板,一个是微星主板,现在将实现写为一样

不同的主板对同一个命令的操作可以是不同的

技嘉主板

package day12命令模式.Impl;import day12命令模式.ZhuBanApi;public class JiJiaZhuBanImpl implements ZhuBanApi {@Overridepublic void open() {System.out.println("技嘉主板正在开机,请等候");System.out.println("接通电源......");System.out.println("设备检查......");System.out.println("装载系统......");System.out.println("机器正常运转......");System.out.println("机器已经正常打开,请操作");}
}

微星主板

package day12命令模式.Impl;import day12命令模式.ZhuBanApi;public class WeiXingZhuBanImpl implements ZhuBanApi {@Overridepublic void open() {System.out.println("微星主板正在开机,请等候");System.out.println("接通电源......");System.out.println("设备检查......");System.out.println("装载系统......");System.out.println("机器正常运转......");System.out.println("机器已经正常打开,请操作");}
}

定义命令接口:里面只有一个方法就是执行

package day12命令模式;/*** 命令接口,声明执行的操作*/
public interface Command {/*** 执行命令对应的操作*/public void execute();
}

命令实现:我们按下的是按钮,但是按钮本身不知道怎么去启动电脑,只有主板知道,所以我们要持有真正实现命令的接收者--主板对象

package day12命令模式.Impl;import day12命令模式.Command;
import day12命令模式.ZhuBanApi;/*** 开机命令接口的实现*/
public class CommandImpl implements Command {/*** 持有真正实现命令的接收者--主板对象*/private ZhuBanApi zhuBanApi = null;/*** 构造方法,传入主板对象* @param zhuBanApi*/public CommandImpl(ZhuBanApi zhuBanApi){this.zhuBanApi = zhuBanApi;}/*** 实现开机*/@Overridepublic void execute() {this.zhuBanApi.open();}
}

提供机箱,按钮是放置在机箱上的。机箱对象,本身有按钮,持有按钮对应的命令对象也就是Command

package day12命令模式;/*** 机箱对象,本身有按钮,持有按钮对应的命令对象*/
public class Box {/*** 开机命令对象*/private Command openCommand;/*** 设置开机命令对象* @param openCommand 开机命令对象*/public void setOpenCommand(Command openCommand) {this.openCommand = openCommand;}/*** 提供给客户使用,接收并相应用户请求,相当于那妞被按下触发的方法*/public void openButton(){openCommand.execute();}
}

客户使用按钮,把与主板连接好的按钮对象放置在机箱上。

package day12命令模式;import day12命令模式.Impl.CommandImpl;
import day12命令模式.Impl.WeiXingZhuBanImpl;public class Client {public static void main(String[] args) {// 1.创建接收者WeiXingZhuBanImpl zhuban = new WeiXingZhuBanImpl();// 2.设置接收者与命令对象的关系  (按钮要进行开机,使用哪个主板)CommandImpl command = new CommandImpl(zhuban);// 3.创建Invoker,用Invoker来执行命令Box box = new Box();// 4.将2中绑定好关系的命令对象设置到Invoker中,让Invoker持有box.setOpenCommand(command);// 5.调用Invoker中的方法,触发要求执行命令// Box定义了方法,,用持有命令对象接口里面的方法,接口的实现中持有真正实现命令的接收者ZhuBanApi,// ZhuBanApi他去调用真正的开机方法,而这个接口有多个实现类,到底调用哪一个呢?// 因为在创建接收者时已经把微星这个接收者与命令对象绑定起来了,所以用的就是微星的实现类box.openButton();}
}

解析:先new一个主板,主板要跟按钮连接成为一个具体的开机命令,我又new一个机箱,把这个升级过的按钮(带有功能)装到这个机箱上,机箱最后调用这个按钮。

1.会发现命令模式的关键之处就是把请求封装成了对象,也就是命令对象,并定义了统一的执行操作的接口。

2.在命令模式中会有一个组装者,他来维护虚实现与真实实现之间的关系

参数化设置

可以用不同的命令对象,去参数化配置客户的请求

定义主板接口,现在增加一个重启的按钮,因此主板加一个方法来实现重启功能

package day12命令模式;/*** 主板的接口*/
public interface ZhuBanApi {/*** 定义一个功能:开机*/public void open();/*** 定义重启功能*/public void reset();
}

 实现类也要改一下

技嘉的

package day12命令模式.Impl;import day12命令模式.ZhuBanApi;/*** 主板的实现*/
public class JiJiaZhuBanImpl implements ZhuBanApi {@Overridepublic void open() {System.out.println("技嘉主板正在开机,请等候");System.out.println("接通电源......");System.out.println("设备检查......");System.out.println("装载系统......");System.out.println("机器正常运转......");System.out.println("机器已经正常打开,请操作");}@Overridepublic void reset() {System.out.println("技嘉主板现在正在重新启动机器,请等候");System.out.println("机器已经正常打开,请操作");}
}

微星的

package day12命令模式.Impl;import day12命令模式.ZhuBanApi;/*** 主板的实现*/
public class WeiXingZhuBanImpl implements ZhuBanApi {@Overridepublic void open() {System.out.println("微星主板正在开机,请等候");System.out.println("接通电源......");System.out.println("设备检查......");System.out.println("装载系统......");System.out.println("机器正常运转......");System.out.println("机器已经正常打开,请操作");}@Overridepublic void reset() {System.out.println("微星主板现在正在重新启动机器,请等候");System.out.println("机器已经正常打开,请操作");}
}

接下来定义命令和按钮,接口不变,添加一个重启命令的实现resetCommandImpl

package day12命令模式.Impl;import day12命令模式.Command;
import day12命令模式.ZhuBanApi;public class ResetCommandImpl implements Command {/*** 持有主板,也就是接收者对象*/private ZhuBanApi zhuBanApi;/*** 构造函数传入* @param zhuBanApi*/public ResetCommandImpl(ZhuBanApi zhuBanApi){this.zhuBanApi = zhuBanApi;}@Overridepublic void execute() {this.zhuBanApi.reset();}
}

Box改造一下,这里增加一个重启命令对象

package day12命令模式;/*** 机箱对象,本身有按钮,持有按钮对应的命令对象*/
public class Box {/*** 开机命令对象*/private Command openCommand;/*** 重启命令对象*/private Command resetCommand;public void setResetCommand(Command resetCommand) {this.resetCommand = resetCommand;}/*** 设置开机命令对象* @param openCommand 开机命令对象*/public void setOpenCommand(Command openCommand) {this.openCommand = openCommand;}/*** 提供给客户使用,接收并相应用户请求,相当于按钮被按下触发的方法*/public void openButton(){openCommand.execute();}/*** 重启按钮*/public void resetButton(){resetCommand.execute();}
}

Client

package day12命令模式;import day12命令模式.Impl.OpenCommandImpl;
import day12命令模式.Impl.ResetCommandImpl;
import day12命令模式.Impl.WeiXingZhuBanImpl;public class Client {public static void main(String[] args) {WeiXingZhuBanImpl zhuban = new WeiXingZhuBanImpl();OpenCommandImpl openCommand = new OpenCommandImpl(zhuban);ResetCommandImpl resetCommand = new ResetCommandImpl(zhuban);Box box = new Box();box.setOpenCommand(openCommand);box.setResetCommand(resetCommand);System.out.println("正确配置");System.out.println(">>>按下开机按钮:>>>");box.openButton();System.out.println(">>>按下重启按钮:>>>");box.resetButton();}
}

命令模式的优点

本质 

命令模式的本质:封装请求

何时选用

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建web应用程序,React和Vue怎么选?

React和Vue都是创建web应用程序的绝佳选择。React得到了科技巨头和庞大的开源社区的支持,代码库可以很大程度地扩展,允许你创建企业级web应用程序。React拥有大量合格甚至优秀的开发人员粉丝,可以解决你在开发阶段可能遇到的任何问题。 毫无疑…

视频汇聚/视频云存储/视频监控管理平台EasyCVR新增首次登录强制修改密码

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。视频汇聚平台既具…

机器学习:无监督学习

文章目录 线性学习方法聚类ClusteringKmeansHAC 分布表示降维PCAMatrix FactorizationManifold LearningLLELaplacian Eigenmapst-SEN 线性学习方法 聚类Clustering Kmeans 随机选取K个中心,然后计算每个点与中心的距离,找最近的,然后更新中…

感觉车载测试的这一波敏捷风快过去了

敏捷,算不得汽车行业的原生产物,几年前,耳边很少听到这个字眼,基本算是在近几年传统汽车行业开始衰落的大背景下,而后伴随着软件从互联网等行业传进来的。 这两年,大家开始把敏捷谈得风生水起,…

如何保证跨境传输的安全性?

随着互联网时代的到来,全球文件传输频率不断增加,市场经济的发展也对信息共享提出更高要求。传统电话交流已无法满足跨国企业的需求,企业内部诸如Web、电子邮件、企业资源计划(ERP)、网络电话(VOIP&#xf…

面试了38位Java候选人之后,我总结出了他们关于面试中的16条通病

都说现在Java面试卷,前段时间项目招人的时候,我刚好就作为面试官面试了一些人 在整个面试的过程中,我就发现了一些关于面试的通病 所以呢,趁着这次金(铜)九银(铁)十的机会&#xf…

WebAssembly 在云原生中的实践指南

1 WebAssembly 介绍 WebAssembly(Wasm)是一种通用字节码技术,它可以将其他编程语言(如 Go、Rust、C/C 等)的程序代码编译为可在浏览器环境直接执行的字节码程序。 WebAssembly 的初衷之一是解决 JavaScript 的性能问…

4、Spring之Bean生命周期源码解析(创建)

Spring最重要的功能就是帮助程序员创建对象(也就是IOC),而启动Spring就是为创建Bean对象做准备,所以我们先明白Spring到底是怎么去创建Bean的,也就是先弄明白Bean的生命周期。 Bean的生命周期就是指:在Spring中,一个Bean是如何生成的,如何销毁的。 Bean生命周期流程图…

C语言练习题解析:挑战与突破,开启编程新篇章!(2)

💓博客主页:江池俊的博客⏩收录专栏:C语言刷题专栏👉专栏推荐:✅C语言初阶之路 ✅C语言进阶之路💻代码仓库:江池俊的代码仓库🎉欢迎大家点赞👍评论📝收藏⭐ 文…

ssm端游游戏账号销售管理系统源码和论文

ssm端游游戏账号销售管理系统源码和论文069 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面…

电脑上的视频如何导入苹果手机?

AirDroid支持Windows、macOS、android、iOS相互传输文件、视频、图片等。 想要从电脑传输文件到iPhone也很简单,在电脑和iPhone都安装AirDroid,连接同一网络,然后登录同一个帐号就可以了。可绑定的iPhone数量不限,只要都登录同一…

测试理论与方法----软件测试工作流程第一个环节:提取测试需求

测试理论与方法 一、软件测试流程 1、软件测试定义 软件:程序数据文档:不仅仅包含应用程序,还应该包含和这个程序相关的数据,文档 软件测试:测试的对象:应用程序,数据,文档 软件…

学习pytorch7 神经网络的基本骨架--nn,module的使用

神经网络的基本骨架--nn,module的使用 官网Module介绍Python父类子类继承关系前向神经网络pycharm快捷键重写类方法codedebug B站小土堆视频学习笔记 官网Module介绍 https://pytorch.org/docs/stable/generated/torch.nn.Module.html#torch.nn.Module Python父类子类继承关系…

Unity 之利用 localEulerAngle与EulerAngle 控制物体旋转

文章目录 概念讲解localEulerAngle与EulerAngle的区别 概念讲解 欧拉角(Euler Angles)是一种常用于描述物体在三维空间中旋转的方法。它使用三个角度来表示旋转,分别绕物体的三个坐标轴(通常是X、Y和Z轴)进行旋转。这…

docker之 Consul(注册与发现)

目录 一、什么是服务注册与发现? 二、什么是consul 三、consul 部署 3.1建立Consul服务 3.1.1查看集群状态 3.1.2通过 http api 获取集群信息 3.2registrator服务器 3.2.1安装 Gliderlabs/Registrator 3.2.2测试服务发现功能是否正常 3.2.3验证 http 和 ng…

LeetCode第21~25题解

CONTENTS LeetCode 21. 合并两个有序链表(简单)LeetCode 22. 括号生成(中等)LeetCode 23. 合并K个升序链表(困难)LeetCode 24. 两两交换链表中的节点(中等)LeetCode 25. K 个一组翻转…

matlab 计算点云协方差矩阵

目录 一、概述1、算法概述2、主要函数二、代码示例三、结果展示四、参数解析输入参数输出参数五、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述

C语言——程序执行的三大流程

顺序 : 从上向下, 顺序执行代码分支 : 根据条件判断, 决定执行代码的分支循环 : 让特定代码重复的执行

构建智慧停车场:4G DTU实现无线数据高速传输

物联网技术的快速发展使得各种设备能够实现互联互通,无线网络技术给我们的日常生活带来了极大的便利。其中的网络技术如无线WiFi及4G网络已经成为了物联网应用中不可或缺的组成部分。而在工业领域中对4G无线路由器的应用是非常广泛的,人们通过4G工业路由…

SpringBoot日志配置

SpringBoot默认日志事打印在console控制台中,不会保存到文件中。 实际项目中必须保存到文件中进行日志分析 一、使用xml配置日志保存(并不需要pom配置slf4j依赖,使用这个默认不用配置pom依赖,最新的spring-boot-starter-web中已…