设计模式之命令模式

写在前面

本文看下命令设计模式。

1:介绍

1.1:什么时候使用命令设计模式

如果某个对象依赖于外部传入的具体参数来执行具体的操作时,就可以考虑使用命令设计模式,如空调的制冷,制热,小爱同学的唱歌,讲笑话等,都是通过外部的具体指令发生的操作。

1.2:UML类图

原型设计模式,包含如下元素:

1:Receiver负责执行具体指令的类,即能够执行特定操作的类
2:Command命令抽象,内部维护Receiver,通过Recevier让命令最终变成具体的动作
3:Invoker维护一组Command,并执行这组指令
4:客户端负责创建Invoker,并设置相关需要执行的指令

2:实例

源码 。

2.1:场景

小明家里有一台空调,可以控制其制冷和制热,有一个小爱同学,可以控制其唱歌🎤和讲笑话。

2.2:程序

  • 定义空调Receiver
// 空调
public class AirConditionerReceiver {// 制冷public void cold() {System.out.println("空调制冷了");}// 制热public void hot() {System.out.println("空调制热了");}
}
  • 定义小爱同学Receiver
// 小爱同学
public class XiaoAiTongXueReceiver {// 唱歌public void sing() {System.out.println("小爱同学唱歌了");}// 讲笑话public void joke() {System.out.println("小爱同学讲笑话了");}
}

接着我们来定义用来执行空调制冷,空调制热,小爱同学唱歌,小爱同学讲笑话的Command类,首先定义接口:

// 命令的抽象,
public interface Command {void exec();
}
  • 各种执行具体动作的Command
    一共四个,分别是执行空调制冷的Command,空调制热的Command,小爱同学唱歌的Command,小爱同学讲笑话的Command,如下:
// 制冷命令,内部调用空调的制冷操作
public class ColdCommand implements Command {private AirConditionerReceiver receiver;public ColdCommand(AirConditionerReceiver receiver) {this.receiver = receiver;}@Overridepublic void exec() {this.receiver.cold();}
}// 制热命令,内部调用空调的制热操作
public class HotCommand implements Command {private AirConditionerReceiver receiver;public HotCommand(AirConditionerReceiver receiver) {this.receiver = receiver;}@Overridepublic void exec() {this.receiver.hot();}
}// 唱歌命令,内部调用小爱同学的唱歌
public class SingCommand implements Command {private XiaoAiTongXueReceiver xiaoAiTongXue;public SingCommand(XiaoAiTongXueReceiver xiaoAiTongXue) {this.xiaoAiTongXue = xiaoAiTongXue;}@Overridepublic void exec() {this.xiaoAiTongXue.sing();}
}// 讲笑话命令,内部调用小爱同学的讲笑话
public class JokeCommand implements Command {private XiaoAiTongXueReceiver xiaoAiTongXue;public JokeCommand(XiaoAiTongXueReceiver xiaoAiTongXue) {this.xiaoAiTongXue = xiaoAiTongXue;}@Overridepublic void exec() {this.xiaoAiTongXue.joke();}
}
  • 定义Invoker
    维护一组要执行的Command,其中Command的设置由客户端完成:
public class MyInvoker {// 自己用(仅本类用)private// 不可改变引用值 finalprivate final List<Command> commands = new ArrayList<Command>();// 设置一组命令,由命令来完成具体的动作,内部操作是如何完成的对用户是透明的public void addCommand(Command command) {this.commands.add(command);}// 执行命令public void execCommand() {commands.forEach(v -> v.exec());}
}
  • 客户端
public static void main(String[] args) {// 创建具体命令的执行者们AirConditionerReceiver airConditionerReceiver= new AirConditionerReceiver();XiaoAiTongXueReceiver xiaoAiTongXueReceiver = new XiaoAiTongXueReceiver();// 创建命令Command singCommand = new SingCommand(xiaoAiTongXueReceiver);Command jokeCommand = new JokeCommand(xiaoAiTongXueReceiver);Command coldCommand = new ColdCommand(airConditionerReceiver);Command hotCommand = new HotCommand(airConditionerReceiver);// 把命令添加到invokerMyInvoker myInvoker = new MyInvoker();myInvoker.addCommand(singCommand);myInvoker.addCommand(jokeCommand);myInvoker.addCommand(hotCommand);myInvoker.addCommand(coldCommand);// 执行命令myInvoker.execCommand();
}

运行:

小爱同学唱歌了
小爱同学讲笑话了
空调制热了
空调制冷了

写在后面

参考文章列表

秒懂设计模式之命令模式(Command Pattern) 。

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

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

相关文章

opencv 图像距离变换 distanceTransform

图像距离变换&#xff1a;计算图像中每一个非零点距离离自己最近的零点的距离&#xff0c;然后通过二值化0与非0绘制图像。 #include "iostream" #include "opencv2/opencv.hpp" using namespace std; using namespace cv;int main() {Mat img, dst, dst…

洛必达法则和分部积分的应用之计算数学期望EX--概率论浙大版填坑记

如下图所示&#xff0c;概率论与数理统计浙大第四版有如下例题&#xff1a; 简单说就是&#xff1a;已知两个相互独立工作电子装置寿命的概率密度函数&#xff0c;将二者串联成整机&#xff0c;求整机寿命的数学期望。 这个题目解答中的微积分部分可谓是相当的坑爹&#xff0c;…

Jenkins中sh函数的用法

在Jenkins的Pipeline中&#xff0c;sh函数的用法 用法一 单个命令字符串包括使用&#xff0c;示例如下&#xff1a; sh echo "Hello, Jenkins!"用法二 多个命令字符串包括命令列表使用&#xff0c;示例如下&#xff1a; sh echo "Step 1" echo "…

vue/cli 自定义配置

vue/cli 自定义配置 1、更改默认的端口号8080 只需要更改vue.config.js文件 1、更改默认的端口号8080 只需要更改vue.config.js文件

脑电信号处理与特征提取——4.脑电信号的预处理及数据分析要点(彭微微)

目录 四、脑电信号的预处理及数据分析要点 4.1 脑电基础知识回顾 4.2 伪迹 4.3 EEG预处理 4.3.1 滤波 4.3.2 重参考 4.3.3 分段和基线校正 4.3.4 坏段剔除 4.3.5 坏导剔除/插值 4.3.6 独立成分分析ICA 4.4 事件相关电位&#xff08;ERPs&#xff09; 4.4.1 如何获…

使用flask-sqlacodegen自动生成model实体类

使用flask-sqlacodegen自动生成model实体类 依赖库版本如下(供参考)&#xff1a; flask-sqlacodegen 1.1.7sqlalchemy 1.4.36flask-sqlalchemy 3.0.3安装依赖库 pip install -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com sqlalchem…

flutter fl_chart 柱状图 柱条数量较多 实现左右滑动 固定y轴

一、引入插件 pub.dev&#xff1a;fl_chart package - All Versions 根据项目版本&#xff0c;安装可适配的 fl_chart 版本 二、官网柱状图示例 github参数配置&#xff1a;&#xff08;x轴、y轴、边框、柱条数据、tooltip等&#xff09; https://github.com/imaNNeo/fl_c…

【LeetCode】70.爬楼梯

题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例 2…

什么是UE像素流送,像素流推流是什么原理?

游戏开发者通常在运行游戏逻辑时会将游戏渲染到屏幕的同一台设备上来运行虚幻引擎应用&#xff0c;多人联网游戏可能会在应用程序的多个实例之间分发部分游戏逻辑&#xff0c;但每个单独的实例仍然会为自己的玩家在本地渲染游戏。即使是使用 HTML5 部署选项创建可以在 Web 浏览…

解决@Scope(“prototype“)不生效的问题

目录 Scope(“prototype“)不生效Scope(“prototype“)正确用法——解决Bean多例问题 1.问题&#xff0c;Spring管理的某个Bean需要使用多例2.问题升级3. Spring给出的解决问题的办法&#xff08;解决Bean链中某个Bean需要多例的问题&#xff09; Scope(“prototype“)不生效 …

【ribbon】Ribbon的使用与原理

负载均衡介绍 负载均衡&#xff08;Load Balance&#xff09;&#xff0c;其含义就是指将负载&#xff08;工作任务&#xff09;进行平衡、分摊到多个操作单元上进行运行&#xff0c;例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等&#xff0c;从而协同…

【《Go编程进阶实战:开发命令行应用、HTTP应用和gRPC应用》——指导你使用Go语言构建健壮的、生产级别的应用程序】

谷歌在2009年发布了Go编程语言&#xff0c;并于2012年发布了1.0版。Go语言具有强大的兼容性&#xff0c;一直用于编写可扩展的重量级程序(命令行应用程序、关键基础设施工具乃至大规模分布式系统)。凭借简单性、丰富的标准库和蓬勃发展的第三方软件包生态系统&#xff0c;Go语言…

工程安全监测无线振弦采集仪在建筑物中的应用

工程安全监测无线振弦采集仪在建筑物中的应用 工程安全监测无线振弦采集仪是一种用于建筑物结构安全监测的设备&#xff0c;它采用了无线传输技术&#xff0c;具有实时性强、数据精度高等优点&#xff0c;被广泛应用于建筑物结构的实时监测和预警。下面将从设备的特点、应用场…

FPGA中RAM的结构理解

FPGA中RAM的结构理解 看代码的过程中对RAM的结构不是很理解&#xff0c;搞脑子一片浆糊&#xff0c;反复推算&#xff0c;好不容易理清了思路&#xff0c;记录下来&#xff0c;防止忘记。开辟的RAM总容量为128bytes&#xff0c;数据的位宽为32位&#xff08;即一个单元有32bit…

WebGL系列教程:WebGL入门

一、WebGL简介 1.1 概述 WebGL(全写 Web Graphics Library)是一种 3D 绘图标准,这种绘图技术标准允许把 JavaScript 和 OpenGL ES 2.0 结合在一起,通过增加 OpenGL ES 2.0 的一个 JavaScript 绑 定,WebGL 可以为 HTML5 Canvas 提供硬件 3D 加速渲染,这样 Web 开发人员就可…

WPF 如何设置全局的订阅发布事件

文章目录 前言代码逻辑修改 总结 前言 我们需要一个全局事件订阅发布功能&#xff0c;实现页面通讯。使两个毫无关系的页面通过一个中间量进行通讯。 代码 IEventAggregator&#xff1a;消息订阅集合 这个是Prism提供的消息订阅功能。使用如下 设置订阅类型&#xff0c;即…

Linux の shell 基本语法

变量 shell中变量比较特殊&#xff0c;变量名和等号之间不能有空格。其它的跟常见的变成语言类似 命名规则&#xff1a; 命名只能使用英文字母&#xff0c;数字和下划线&#xff0c;首个字符不能以数字开头。 中间不能有空格&#xff0c;可以使用下划线 _。 不能使用标点符号。…

Flask 创建文件目录,删除文件目录

项目结构 app.py from flask import Flask, render_template, request, redirect, url_for import osapp Flask(__name__) BASE_DIR os.path.abspath(os.path.dirname(__file__)) FILE_DIR os.path.join(BASE_DIR, testfile)app.route(/, methods[GET, POST]) def index():…

HTTP和HTTPS的区别

一、两者概念 1.1 HTTP概念 HTTP 的全称是超文本传输协议&#xff08;HyperText Transfer Protocol&#xff09; 是一种用于分布式、协作式和超媒体信息系统的应用协议&#xff0c;简单来说就是一种分布和接收HTML页面的方法&#xff0c;被用于在Web浏览器和网站服务器之间传递…

认识tomcat

Tomcat作为流行的JavaWeb应用服务器,其工作原理可以简要总结如下几点: Tomcat实现了Servlet和JSP规范,可以运行相关的Web应用。 Tomcat由Catalina、Coyote和Jasper等模块组成。Catalina负责Servlet容器,Coyote实现连接器。 服务器由一个或多个服务构成,服务包含多个连接器和容…