【行为型模式】命令模式

embedded/2024/10/18 16:46:09/

一、命令模式概述

        命令模式的定义将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。(对象行为型)

  • 命令模式优缺点
    • 优点
      • 1.类间解耦:调用者角色与接收者角色之间没有任何依赖关系,调用者实现功能时只需调用Command 抽象类的execute方法就可以,不需要了解到底是哪个接收者执行。
      • 2.可扩展性:Command的子类可以非常容易地扩展,而调用者Invoker和高层次的模块Client不产生严 重的代码耦合。
      • 3.命令模式结合其他模式会更优秀:命令模式可以结合责任链模式,实现命令族解析任务;结合模板方法模式,则可以减少 Command子类的膨胀问题。
    • 缺点
      • 如果有N个命令,问题就出来 了,Command的子类就可不是几个,而是N个,这个类膨胀得非常大。
  • 适用环境
    • 1.需要先将一个函数登记上,然后再以后调用此函数时,就需要使用命令模式,其实这就是回调函数
    • 2.有时候需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是什么。此时希望用一种松耦合的方式来设计程序,使得请求发送者和请求接收者能够消除彼此之间的耦合关系。

二、代码实现

        命令模式包含四个角色:

  • Command命令角色(抽象):声明执行命令的接口,拥有执行命令的抽象方法 execute ();
  • ConcreteCommand(具体命令):是抽象命令类的具体实现类,它拥有接收者对象,并通过调用接收者的功能来完成命令要执行的操作;
  • Invoker调用者角色:是请求的发送者,它通常拥有很多的命令对象,并通过访问命令对象来执行相关请求,它不直接访问接收者。
  • Receiver接受者角色:执行命令功能的相关操作,是具体命令对象业务的真正实现者;
        2.1 抽象命令(Command接口)
java">package Command.remoteControl;
//命令接口
public interface Command {//执行命令public void execute();
}
        2.2 具体命令(LightOnCommand、LightOffCommand、NoCommand、StereoOnWithCDCommand、StereoOffCommand)
java">package Command.remoteControl;
//具体命令,接受并执行命令,开灯命令
public class LightOnCommand implements Command {private Light light;public LightOnCommand(Light light){this.light = light;}@Overridepublic void execute() {// TODO Auto-generated method stublight.on();}}
java">package Command.remoteControl;
//具体命令,接受并执行命令,关灯
public class LightOffCommand implements Command {private Light light;public LightOffCommand(Light light){this.light = light;}@Overridepublic void execute() {// TODO Auto-generated method stublight.off();}}
java">package Command.remoteControl;
//具体命令,接受并执行命令,无任何响应命令
public class NoCommand implements Command {@Overridepublic void execute() {// TODO Auto-generated method stub}}
java">package Command.remoteControl;
//具体命令,接受并执行命令,开CD且音量为14
public class StereoOnWithCDCommand implements Command {private Stereo stereo;public StereoOnWithCDCommand(Stereo stereo) {this.stereo = stereo;}@Overridepublic void execute() {// TODO Auto-generated method stubstereo.on();stereo.setCD();stereo.setVolume(14);}}
java">package Command.remoteControl;
//具体命令,接受并执行命令,关音响
public class StereoOffCommand implements Command {private Stereo stereo;public StereoOffCommand(Stereo stereo) {this.stereo = stereo;}@Overridepublic void execute() {// TODO Auto-generated method stubstereo.off();}}
        2.3 Invoker(Light、Stereo)
java">package Command.remoteControl;
//Invoker,发送开关请求,电灯
public class Light {String position;public Light(String position) {this.position = position;}public void on(){System.out.println(position +" light is on...");}public void off(){System.out.println(position+" light is off...");}}
java">package Command.remoteControl;
//Invoker,发送开关音量请求,音响
public class Stereo {String position;public Stereo(String position) {this.position = position;}public void on(){System.out.println(position + " stereo is on...");}public void off(){System.out.println(position + " stereo is off...");}public void setCD() {System.out.println(position+ " stereo is set for CD input...");}public void setVolume(int volume) {System.out.println(position+" stereo volume set to " + volume);}}
         2.4 接收者(RemoteControl)
java">package Command.remoteControl;
//Receiver:干活,遥控器
public class RemoteControl {//开灯private Command[] onCommands;//关灯private Command[] offCommands;public RemoteControl(){//初始化开与关的数组onCommands = new Command[7];offCommands = new Command[7];NoCommand noCommand = new NoCommand();for(int i=0;i<7;i++){onCommands[i] = noCommand;offCommands[i] = noCommand;}}/*** 设置按钮指令* @param position* @param onCommand* @param offCommand*/public void setCommand(int position,Command onCommand, Command offCommand){onCommands[position] = onCommand;offCommands[position] = offCommand;}//按下开或关,硬件就负责调用对应的方法public void onButtonWasPushed(int position) {onCommands[position].execute();}public void offButtonWasPushed(int position) {offCommands[position].execute();}public String toString() {StringBuffer stringBuff = new StringBuffer();stringBuff.append("\n------ Remote Control -------\n");for (int i = 0; i < onCommands.length; i++) {stringBuff.append("[slot " + i + "] " + onCommands[i].getClass().getName()+ "    " + offCommands[i].getClass().getName() + "\n");}return stringBuff.toString();}}
        2.5 main方法实现命令模式
java">package Command.remoteControl;public class RemoteLoader {public static void main(String[] args) {// TODO Auto-generated method stubRemoteControl remoteControl = new RemoteControl();Light livingRoomLight = new Light("Living Room");LightOnCommand livingRoomLightOn = new LightOnCommand(livingRoomLight);LightOffCommand livingRoomLightOff = new LightOffCommand(livingRoomLight); Stereo stereo = new Stereo("Living Room");StereoOnWithCDCommand setreoOnWithCD = new StereoOnWithCDCommand(stereo);StereoOffCommand setreoOff = new StereoOffCommand(stereo);//加载到遥控器槽中remoteControl.setCommand(0, livingRoomLightOn, livingRoomLightOff);remoteControl.setCommand(1, setreoOnWithCD, setreoOff);//打印遥控器插槽和被指定的命令System.out.println(remoteControl);//按遥控器remoteControl.onButtonWasPushed(0);remoteControl.offButtonWasPushed(0);remoteControl.onButtonWasPushed(1);remoteControl.offButtonWasPushed(1);}}
        2.6 UML图

三、代码结构


http://www.ppmy.cn/embedded/10080.html

相关文章

nodejs工具脚本json转excel

json转excel 主要使用 sheetjs 库 vim convertJsonToExcel.js 封装转换方法 import fs from fs; import XLSX from xlsx;/*** 扁平化嵌套json对象* param {Object} jsonObj* param {String} prefix* returns*/ export function flattenKeys(jsonObj, prefix ) {const resul…

NLP大模型的训练

NLP模型的训练主要分成两步&#xff1a; 1.先进行通用任务的训练&#xff1b;无监督的样本是无穷无尽的&#xff1b; 这里列举两种&#xff1a;MLM和NSP,NSP由于在某些论文中被证明是无效的&#xff0c;所以用的少&#xff1b; MLM: 接下来会在特定任务上进行finetune>su…

前端框架EXT.NET Dotnet 3.5开发的实验室信息管理系统(LIMS)成品源码 B/S架构

前端框架EXT.NET Dotnet 3.5开发的实验室信息管理系统&#xff08;LIMS&#xff09;成品源码 B/S架构 LIMS实验室管理系统 发展历史 实验室信息管理系统(LIMS)&#xff0c;就是指通过计算机网络技术对实验的各种信息进行管理的计算机软、硬件系统。也就是将计算机网络技术与现…

AR HUD_VSLAM+显示技术

智能座舱的一个重要技术方向是表达与展示。HUD可以将驾驶相关的信息&#xff0c;如车速、导航等投射到驾驶员的视线上方&#xff0c;避免驾驶员的目光离开前方道路。这种显示方式可以提供关键信息的实时展示&#xff0c;减少驾驶员的分心。 HUD的技术原理就是通过光学系统将信息…

Vue阶段练习:tab栏、进度条、

阶段练习旨在学习完Vue 指令、计算属性、侦听器-CSDN博客后&#xff0c;进行自我检测&#xff0c;每个练习分为效果显示、需求分析、静态代码、完整代码、总结 四个部分&#xff0c;效果显示和准备代码已给出&#xff0c;我们需要完成“完整代码”部分。 练习1&#xff1a;tab栏…

Linux tcp/ip 网路协议栈学习-00 前言

Linux tcp/ip 网路协议栈学习-00 前言 目录 Linux tcp/ip 网路协议栈学习-00 前言 (1)预备知识 (2)前置知识 (3)学习目标 (4)总结 (1)预备知识 好工具事半功倍&#xff0c;做任何事情都需要有方法和工具&#xff0c;同样&#xff0c;阅读 Linux 内核源码也是如此…

Docker 基本管理

目录 Docker 概述 容器化越来越受欢迎&#xff0c;因为容器是&#xff1a; Docker与虚拟机的区别&#xff1a; 容器技术有哪些 容器在内核中支持2种重要技术&#xff1a; 六大namespace Docker核心概念&#xff1a; Docker 概述 Docker是一个开源的应用容器引擎&#xf…

【Spring Cloud】服务容错中间件Sentinel进阶——五大规则

文章目录 Sentinel的概念和功能基本概念资源规则 重要功能流量控制熔断降级系统负载保护 SentineI 规则流控规则简单配置配置流控模式直接流控模式关联流控模式链路流控模式 配置流控效果 熔断规则慢调用比例异常比例异常数 热点规则热点规则简单使用热点规则增强使用 授权规则…