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://www.hqwc.cn/news/698511.html

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

相关文章

手机照片怎么恢复?别担心,这里有解决方案

手机&#xff0c;已经成为我们生活中不可或缺的伴侣。它记录下我们的欢笑、泪水、重要时刻和无数平凡的日子。但有时候&#xff0c;由于误操作、手机故障或是其他原因&#xff0c;我们可能会不小心删除了珍贵的手机照片。手机照片怎么恢复呢&#xff1f;别担心&#xff0c;今天…

Hbuild-X运行ios基座app

一、说明 ios真机第一次运行的时候需要下载插件&#xff0c;这个都是自动监测&#xff0c;自动下载的&#xff0c;不用多说。ios真机运行是需要签名的&#xff0c;不然就会报以下错误。如何制作免费的签名证书呢&#xff0c;需要借助爱思助手来完成。 二、安装爱思助手 &…

Hive-表设计优化

Hive-表设计优化 1.Hive查询基本原理 Hive的设计思想是通过元数据解析描述将HDFS上的文件映射成表。 基本的查询原理是当用户通过HQL语句对Hive中的表进行复杂数据处理和计算时&#xff0c;默认将其转换为分布式计算MapReduce程序对HDFS中的数据进行读取处理的过程。 当执行…

JDK介绍

JDK是Java Development Kit的缩写&#xff0c;是Oracle公司提供的用于开发Java应用程序的开发包。它包括了Java运行环境&#xff08;Java Runtime Environment&#xff09;&#xff0c;以及一系列Java工具&#xff08;如javac、java、jdb等&#xff09;和Java基础类库&#xff…

Django自定义封装Response

Django自定义封装Response 目录 Django自定义封装Response定义Response类视图层示例 定义Response类 # utils/common_response.py from rest_framework.response import Response# 继承DRF的Response并重写__init__ class APIResponse(Response):def __init__(self, code100, …

fastadmin 按月份搜索

标题 js里显示月份并且搜索的时候可选择月份 { field: date, title: __(日期), operate: , data:data-date-format"YYYY-MM", addclass:datetimepicker },只写js样式会错乱&#xff0c;如图&#xff1a; 修改css样式 <style type"text/css">.com…

106短信平台疑难解答:为何手机正常却收不到短信?

当您使用群发短信平台发送消息时&#xff0c;有时尽管系统提示发送成功&#xff0c;但手机却未能收到短信。这背后可能隐藏着一些不为人知的原因。 首先&#xff0c;我们要明确&#xff0c;在正常情况下&#xff0c;只要手机状态正常&#xff0c;都应该能够接收到短信。然而&am…

算法加密-简介

前言 在遥远的古代&#xff0c;信息的传递至关重要。战争时期&#xff0c;将领们需要确保自己的作战计划不被敌人知晓。 有一次&#xff0c;一位聪明的将军想要给远方的盟友传递一份机密战略部署。他想到了一个办法&#xff0c;用一种特殊的符号来替代文字。他和盟友事先约定好…

学习笔记:Adaptive Platform(AP)适配到RTOS

一、背景 1、AP版本 Adaptive Platform AUTOSAR R20-11版本标准支持C14。CM模块支持DDS、SOME/IP协议 2、RTOS RTOS-A核&#xff0c;当前完全支持POSIX PSE51、POSIX PSE52接口&#xff0c;POSIX PSE53部分支持&#xff0c;POSIX PSE54基本不支持。详细接口参考&#xff1a…

QMT如何写代码获取基金数据?方法总结!

此函数被设计为只支持单一基金查询&#xff0c;用于获取详细的股票信息。该函数可以让您接收关于特定基金的深度信息&#xff0c;包括但不限于其涨跌停价格、上市日期、退市日期以及期权到期日等重要数据。这将为您提供详尽的信息&#xff0c;以便更好地理解并分析股票的历史和…

远程监控供水设备运行状态

随着城市化进程的加快&#xff0c;供水设备的安全稳定运行对于保障居民日常生活和工业生产至关重要。然而&#xff0c;传统的供水设备管理方式往往受限于人力、物力和时间的限制&#xff0c;难以实现对供水设备运行状态的全面监控和实时管理。在这一背景下&#xff0c;HiWoo Cl…

防火墙技术基础篇:网络地址转换(NAT):防火墙技术的核心机制

防火墙技术基础篇&#xff1a;网络地址转换&#xff08;NAT&#xff09;&#xff1a;防火墙技术的核心机制 网络地址转换&#xff08;NAT&#xff09;是现代网络架构中不可或缺的一个组成部分&#xff0c;尤其在防火墙技术的实现中扮演着重要角色。本文旨在全面解读NAT的工作机…