Java设计模式 _行为型模式_命令模式

一、命令模式

1、命令模式
命令模式(Command Pattern)是一种行为型模式,一种数据驱动的设计模式。命令模式中请求以命令的形式包裹在对象中,即将命令封装为类,从而可以使用不同的请求,队列等操作具体的对象等。完整设计时需要支持执行和撤回两种操作,也可以继续扩展。

2、实现思路
命令模式包含三种角色
(1)、命令(包含:抽象和实现类)
(2)、接收者(用于执行命令,包含抽象和实现类)
(3)、发送者(发送命令,具体实现类)
具体步骤:
(1)、定义接收者规范接口
(2)、编写接收者的实现类
(3)、定义命令规范接口
(4)、编写命令的实现类(包含接收者对象属性,实例属性的方法(构造或自定义),实现命令的方法)
(5)、编写发送者类(内置封装业务的命令,用于统一控制命令的发送,类似遥控器)

二、代码示例

1、示例场景
电视遥控器不同的按钮发送不同的指令,电视机是接收者,使用遥控器控制电视机的各种使用场景。

// 1、定义接收者的规范
public interface Receiver {void turnOn();      // 开机void turnOff();     // 关闭void switchChannel(int num);    // 切换数据
}
// 2、定义接收者的实现类(电视机)
public class Tv implements Receiver {@Overridepublic void turnOn() {System.out.println("打开电视机");}@Overridepublic void turnOff() {System.out.println("关闭电视机");}@Overridepublic void switchChannel(int num) {System.out.println("切换频道为" + num);}
}
// 3、定义命令的规范(仅执行,撤回本场景不考虑)
public interface Order {void excute(int num);   // 参数根据业务确认,可以使用map封装兼容所有的情况。本例比较简单以int整数测试
}
// 4.1、定义具体命令(打开电视)
public class Order_TurnOn implements Order {private Receiver receiver;public Order_TurnOn(Receiver receiver) {this.receiver = receiver;}@Overridepublic void excute(int num) {this.receiver.turnOn();}
}
// 4.2、定义具体命令(关闭电视)
public class Order_TurnOff implements Order {private Receiver receiver;public Order_TurnOff(Receiver receiver) {this.receiver = receiver;}@Overridepublic void excute(int num) {this.receiver.turnOff();}
}
// 4.3、定义具体命令(切换频道)
public class Order_SwitchChannel implements Order {private Receiver receiver;public Order_SwitchChannel(Receiver receiver) {this.receiver = receiver;}@Overridepublic void excute(int num) {this.receiver.switchChannel(num);}
}
// 5、定义遥控器类(封装命令的集合和遥控器案件的映射关系,通过映射完成具体的命令发送)
import org.apache.commons.lang3.math.NumberUtils;
import java.util.HashMap;
import java.util.Map;public class TvRemoteControl {private static Map<String, Order> orderMap;   // 遥控器案件对应指令集合static {  // 初始化封装遥控器指令orderMap = new HashMap<>();Tv tv = new Tv();orderMap.put("on", new Order_TurnOn(tv));   // 按1打开电视orderMap.put("off", new Order_TurnOff(tv));   // 按2关闭电视Order_SwitchChannel order_switchChannel = new Order_SwitchChannel(tv);for (int i = 1; i <= 10; i++) {orderMap.put(String.valueOf(i), order_switchChannel);   // 数字对应为切换的频道}}public void sendOrder(String orderNum) {if (orderMap.keySet().contains(orderNum)) {Order order = orderMap.get(orderNum);int num = 0;boolean isNum = NumberUtils.isDigits(orderNum);if (isNum) {num = NumberUtils.toInt(orderNum);}order.excute(num);} else {System.out.println("无效的指令");}}
}
// 6、测试
public static void main(String[] args) {TvRemoteControl tvRemoteControl = new TvRemoteControl();tvRemoteControl.sendOrder("on");tvRemoteControl.sendOrder("5");tvRemoteControl.sendOrder("9");tvRemoteControl.sendOrder("off");}

运行结果:
在这里插入图片描述
可以看到通过遥控器类的具体按钮参数,正确的调用到了具体的命令。本例仅以比较简单的遥控器为示例,如果是比较复杂的遥控器需要在封装map时梳理好对应关系。

总结:
命令模式的主要核心就是将命令封装为业务类,通过发送者,命令,接收者三者之间的逻辑关系(发送者能创建发送命令,命令中包含接收者的属性对象),以此关系来完成某些业务场景下的业务要求。

学海无涯苦作舟!!!

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

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

相关文章

基于STM32移植lvgl(V8.2)(SPI接口的LCD)

目录 概述 1 认识LVGL 1.1 LVGL官网 1.2 LVGL库文件下载 2 认识SPI接口型LCD 2.1 PIN引脚定义 2.2 MCU IO与LCD PIN对应关系 3 实现LCD驱动 3.1 使用STM32Cube配置Project 3.2 STM32Cube生成工程 4 移植LVGL 4.1 准备移植文件 4.2 添加lvgl库文件到项目 4.2.1 src下…

信息系统项目管理师0101:项目建议与立项申请(7项目立项管理—7.1项目建议与立项申请)

点击查看专栏目录 文章目录 第七章 项目立项管理7.1项目建议与立项申请1.立项申请概念2.项目建议书内容记忆要点总结第七章 项目立项管理 项目立项管理是对拟规划和实施的项目技术上的先进性、适用性,经济上的合理性、效益性,实施上的可能性、风险性以及社会价值的有效性、可…

今日总结2024/5/10

今日复习01背包,完全背包,多重背包DP,以及多重背包优化 01背包 每个物品只能选一次&#xff0c;可以选或不选 f[i,j]表示选到前i个物品体积不超过j的最大价值 状态转移方程为f[i][j]max(f[i-1][j],f[i-1][j-v[i]]w[i]) 优化空间采用滚动数组,从大到小枚举体积即可 完全背…

14:java基础-Tomcat-Web容器

文章目录 面试题Web 容器是什么&#xff1f;HTTP 的本质 面试题 Web 容器是什么&#xff1f; 让我们先来简单回顾一下 Web 技术的发展历史&#xff0c;可以帮助你理解 Web 容器的由来。早期的 Web 应用主要用于浏览新闻等静态页面&#xff0c;HTTP 服务器&#xff08;比如Apa…

学习Java的日子 Day45 HTML常用的标签

Day45 HTML 1.掌握常用的标签 1.1 标题标签 h1-h6 <h1>一级标签</h1> <h2>二级标签</h2> <h3>三级标签</h3> <h4>四级标签</h4> <h5>五级标签</h5> <h6>六级标签</h6> 显示特点&#xff1a; * 文字…

【Java难点】多线程-终极【更新中...】

Java内存模型之JMM 为什么需要JMM 计算机存储结构&#xff1a;从本地磁盘到主存到CPU缓存&#xff0c;也就是从硬盘到内存&#xff0c;到CPU。一般对应的程序的操作就是从数据库查数据到内存然后到CPU进行计算。 CPU和物理主内存的速度不一致&#xff0c;所以设置多级缓存&am…

玩游戏专用远程控制软件

玩游戏专用远程控制软件&#xff1a;实现远程游戏的新体验 随着网络技术的不断发展和创新&#xff0c;远程控制软件已经逐渐渗透到我们生活的方方面面&#xff0c;尤其是在游戏领域。玩游戏专用远程控制软件&#xff0c;作为这一趋势下的产物&#xff0c;为玩家提供了全新的游…

“幽灵“再临!新型攻击瞄准英特尔CPU;微软Outlook漏洞被俄利用,网络间谍攻击捷克德国实体 | 安全周报0510

1. 微软Outlook漏洞被俄罗斯APT28利用&#xff0c;捷克德国实体遭网络间谍攻击&#xff01; 捷克和德国于周五透露&#xff0c;他们成为与俄罗斯有关的APT28组织进行的长期网络间谍活动的目标&#xff0c;此举遭到欧洲联盟&#xff08;E.U.&#xff09;、北大西洋公约组织&…

unreal engine4 创建动画蒙太奇

UE4系列文章目录 文章目录 UE4系列文章目录前言一、创建动画蒙太奇 前言 动画蒙太奇的官方解释&#xff1a;Animation Montages are animation assets that enable you to combine animations in a single asset and control playback using Blueprints.You can use Animation…

vue3.x + echarts 5.x + ant-design-vue 4.x + monaco-editor v3 新增版本切换功能

前言 1. 因为vue架构中&#xff0c;大多数包都是通过npm / yarn 等工具直接安转到node_modules 使用 2. 多个版本切换时&#xff0c;不可能全部安装echarts版本 3. 所以思路围绕如何通过cdn动态引入echarts一、添加工具代码 loadScript 路径 utils/loadScript.js export de…

JINGWHALE 量子能量意识进化理论 —— 全息世界

JINGWHALE 对此论文相关未知以及已知概念、定理、公式、图片等内容的感悟、分析、创新、创造等拥有作品著作权。未经 JINGWHALE 授权&#xff0c;禁止转载与商业使用。 人类对于自身的来源充满了好奇心和求知欲望&#xff0c;探索人类起源是人类科学研究和探索的重要领域之一。…

Leetcode—239. 滑动窗口最大值【困难】

2024每日刷题&#xff08;132&#xff09; Leetcode—239. 滑动窗口最大值 算法思想 用vector会超时的&#xff0c;用deque最好&#xff01; 实现代码 class Solution { public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {deque<int> …

免费远程控制软件哪个好用

免费远程控制软件哪个好用 在现今高度信息化的社会&#xff0c;远程控制软件已成为许多用户进行远程办公、技术支持和教育培训的重要工具。市面上有许多免费的远程控制软件&#xff0c;但哪款才是最好用的呢&#xff1f;本文将为您介绍几款热门的免费远程控制软件&#xff0c;…

Babel基础知识及实现埋点插件

目录 前言 AST 遍历 Visitors Paths&#xff08;路径&#xff09; Paths in Visitors&#xff08;存在于访问者中的路径&#xff09; State&#xff08;状态&#xff09; Scopes&#xff08;作用域&#xff09; Bindings&#xff08;绑定&#xff09; API babylo…

【Ajax零基础教程】-----第四课 简单实现

一、XMLHttpRequest对象 通过XMLHttpRequest对象来向服务器发送异步请求&#xff0c;从服务器获取数据。然后用JavaScript来操作DOM而更新页面。XMLHttpRequest是ajax的核心机制&#xff0c;它是IE5中首先引入的&#xff0c;是一种支持异步请求的技术。 简单的说&#xff0c;也…

融知财经:期货和现货的区别是什么?哪个风险大?

期货和现货在交易对象等方面存在明显的区别。期货交易是一种衍生金融工具&#xff0c;主要用于价格发现、风险管理和投机&#xff0c;而现货交易则是商品和服务的实际买卖。在选择进行期货交易还是现货交易时&#xff0c;投资者需要根据自己的需求和市场情况来决定。 期货和现货…

(三十九)第 6 章 树和二叉树(二叉树的三叉链表存储)

1. 背景说明 2. 示例代码 1) errorRecord.h // 记录错误宏定义头文件#ifndef ERROR_RECORD_H #define ERROR_RECORD_H#include <stdio.h> #include <string.h> #include <stdint.h>// 从文件路径中提取文件名 #define FILE_NAME(X) strrchr(X, \\) ? strrc…

在k8s中安装Grafana并对接Prometheus,实现k8s集群监控数据的展示

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Grafana&#xff1a;让数据说话的魔术师》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Grafana简介 2、Grafana的重要性与影响力 …

​​​【收录 Hello 算法】第 5 章 栈与队列

第 5 章 栈与队列 Abstract 栈如同叠猫猫&#xff0c;而队列就像猫猫排队。 两者分别代表先入后出和先入先出的逻辑关系。 本章内容 5.1 栈5.2 队列5.3 双向队列5.4 小结

【Web】CTFSHOW 单身杯 题解

目录 web签到 easyPHP 姻缘测试 web签到 用data协议包含php标签闭合 payload: filedata://text/plain,<?php system($_GET[1]);?>>?;)]1[TEG_$(metsys php?<,nialp/txet//:atadeasyPHP 一眼awk命令执行 payload: cmdawk&param{system("ta…