18【命令设计模式】

news/2024/5/19 20:25:58/文章来源:https://blog.csdn.net/Bb15070047748/article/details/127095646

文章目录

  • 十八、命令设计模式
    • 18.1 命令设计模式简介
      • 18.1.1 命令设计模式概述
      • 18.1.2 命令设计模式的UML类图
    • 18.2 命令设计模式的实现
    • 18.3 命令设计模式的优缺点


十八、命令设计模式

18.1 命令设计模式简介

18.1.1 命令设计模式概述

命令设计模式(Command Pattern):命令模式是对命令的封装,将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。命令模式解耦了请求方和接收方,请求方只需要请求执行命令,不需要关心命令怎样被接收,怎样被操作以及是否被执行等;


在软件系统中,请求者与执行者通常是一种紧耦合关系,因为这些实现起来简单明了,但紧耦合的关系伴随着缺乏扩展性。在某些场合中,当对行为进行修改时必定要修改源代码。

而命令模式通过请求域实现间引入一个抽象命令接口,解耦和请求与实现,并且命令接口是抽象的,他由不同的子类实现,因此具备扩展性。命令模式的本质就是解耦命令与执行者;

18.1.2 命令设计模式的UML类图

命令设计模式主要包含如下4个角色:

  • 1)接收者角色(Receiver):负责具体执行一个请求
  • 2)抽象命令角色(ICommand):规范需要执行所有的命令行为
  • 3)具体命令角色(ConcreteCommand):实现具体命令,其内部维护一个Receiver角色,具体功能交给Receiver实现
  • 4)请求角色(Invoker):接收客户端命令,并执行命令;

在这里插入图片描述

18.2 命令设计模式的实现

【案例】

设计一个点餐场景,客户把订单交给服务员,服务员将客户需求交给后厨,后厨接收到订单需求后开始做菜;

  • 订单:命令(Command)
  • 服务员:命令的发送者(Invoker)
  • 后厨:命令接收者(Receiver)

  • 1)命令接收者:
package com.pattern.demo01_手动实现观察者设计模式;/*** @author lscl* @version 1.0* @intro: 厨师(命令接收者)*/
public class CookReceiver {public void menu1(){System.out.println("厨师接到指令......");System.out.println("炒了一盘辣椒炒肉~");System.out.println("--------------------");}public void menu2(){System.out.println("厨师接到指令......");System.out.println("炒了一盘粉蒸肉~");System.out.println("--------------------");}public void menu3(){System.out.println("厨师接到指令......");System.out.println("炒了一盘藜蒿腊肉~");System.out.println("--------------------");}
}
  • 2)抽象命令:
package com.pattern.demo01_手动实现观察者设计模式;/*** @author lscl* @version 1.0* @intro: 抽象菜单,规范客户要点的菜(命令角色,规范客户端能请求什么命令)*/
public interface IMenuCommand {void command();
}
  • 3)具体命令-1:
package com.pattern.demo01_手动实现观察者设计模式;/*** @author lscl* @version 1.0* @intro: 具体菜单(具体命令角色)*/
public class Menu1Command implements IMenuCommand{// 包含命令执行接收者(用于执行具体的命令)private CookReceiver cookReceiver;public Menu1Command(CookReceiver cookReceiver) {this.cookReceiver = cookReceiver;}@Overridepublic void command() {// 最终还是接收者来执行具体的命令(最终还是厨师来炒菜)cookReceiver.menu1();}
}
  • 4)具体命令-2:
package com.pattern.demo01_手动实现观察者设计模式;/*** @author lscl* @version 1.0* @intro:*/
public class Menu2Command implements IMenuCommand {// 包含命令执行接收者(用于执行具体的命令)private CookReceiver cookReceiver;public Menu2Command(CookReceiver cookReceiver) {this.cookReceiver = cookReceiver;}@Overridepublic void command() {cookReceiver.menu2();}
}
  • 5)命令请求/发送者:
package com.pattern.demo01_手动实现观察者设计模式;/*** @author lscl* @version 1.0* @intro: 服务员,接收客人的请求(命令请求者,接收客户端的指令)*/
public class WaiterInvoker {// 服务员具具备发送请求功能,发送请求给厨师进行炒菜private IMenuCommand menuCommand;public WaiterInvoker(IMenuCommand menuCommand) {this.menuCommand = menuCommand;}public void execute(){// 最终把命令发送给厨师menuCommand.command();}}
  • 6)测试代码:
package com.pattern.demo01_手动实现观察者设计模式;/*** @author lscl* @version 1.0* @intro:*/
public class Demo01 {public static void main(String[] args) {// 创建一个厨师(命令接收者,最终由厨师来执行命令)CookReceiver cookReceiver=new CookReceiver();// 创建一个服务员(命令请求者,由服务员来发送命令)WaiterInvoker waiterInvoker=new WaiterInvoker(new Menu1Command(cookReceiver));waiterInvoker.execute();waiterInvoker=new WaiterInvoker(new Menu2Command(cookReceiver));waiterInvoker.execute();}
}

18.3 命令设计模式的优缺点

  • 优点:
    • 1)解耦了命令请求与实现
    • 2)可以在现有命令的基础上,增加额外功能,结合装饰模式会更加灵活
  • 缺点:
    • 1)使用命令模式造成具体命令类增多,系统结构更加复杂

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

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

相关文章

元宇宙人均月入过万?智联报告大揭秘(附下载);华盛顿大学·线性代数进阶课程;电子书·深度神经网络应用(Keras);前沿论文 | ShowMeAI资讯日报

👀日报合辑 | 📆电子月刊 | 🔔公众号下载资料 | 🍩韩信子 📢 人均『月入过万』?元宇宙领域就业现状究竟如何 自2021年元宇宙元年之后,大批元宇宙相关岗位如雨后春笋涌现在市场上。从耳熟能详的…

罗克韦尔 Rockwell RSLogix 500 Crack

罗克韦尔自动化除了提供自动化基础硬件外,还提供大量的软件工具,并在其产品中包含了最新的Microsoft的32位Windows NT及ActiveXTM技术。这些软件为用户采用开放式的工业标准提供方便。另外借助DDE、ActiveX和ODBC兼容技术等,使现场数据能容易…

Chrome 浏览器的 ChromeOptions 参数介绍,selenium 动态渲染必看

背景 在使用 selenium 浏览器渲染技术,爬取网站信息时,默认情况下就是一个普通的纯净的chrome浏览器,而我们平时在使用浏览器时,经常就添加一些插件,扩展,代理之类的应用。相对应的,当我们用ch…

SpringBoot+SpringSecurity+JWT

声明: 该文章为b站博主“三更草堂”视频讲解文档。 视频链接: https://www.bilibili.com/video/BV1mm4y1X7Hc/?spm_id_from333.1007 文章目录SpringSecurity从入门到精通课程介绍0. 简介1. 快速入门1.1 准备工作1.2 引入SpringSecurity2. 认证2.1 登陆校…

Windows系统深度学习Anaconda、PyTorch软件安装教程

1.作者介绍 陈梦丹,女,西安工程大学电子信息学院,2022级研究生,张宏伟人工智能课题组 研究方向:机器视觉与人工智能 电子邮件:1169738496qq.com 安装思路: 根据电脑显卡选择cuda版本&#xf…

软件供应链中代码签名的重要性

你怎麼知道你的代碼是可信的? 在一個難以獲得信任的世界裡,這是一個重要的問題要問自己。 我們如何知道我們正在運行的應用程序、我們正在部署的容器或我們交付給客戶的代碼是真實的? 我們怎麼知道它沒有被篡改? 這一切都歸結為…

VUE3-实习笔记02

本节:ant design 3 的自定义校验规则 这里是获取数据,保存数据,有两个接口,测试邮箱的校验是非必要的,点击“发送测试邮件”才校验,所以规则是要另外加进去的,然后点击保存的时候,把…

python基本操作的作业

查看变量类型的Python内置函数是____。type () 返回单字符在unicode编码表中的值的函数为____。ord() Python中的布尔型只有两个值,分别为:____和____。True 和 False 执行下列语句后,从键盘输入10,程序的结果是: 1…

ActiveReportsJS 在 React 应用程序中添加和自定义查看器

谷歌搜破解版:ActiveReportsJS 3.2中文版是一个客户端报告解决方案,可用于各种不同的前端框架和库。从 vanilla JavaScript 到 NuxtJS,ARJS 在设计应用程序和使用其组件时非常灵活。在本文中,我们将讨论如何通过 Visual Studio Co…

Delphi 开发过程中简单的版本管理与回退

前言 很多时候,我们在进行代码编写或者窗体设计的时候,如果需要回退某些早前修改的内容,基本是使用CtrlZ做刚刚修改内容的回退处理,但如果某些修改已经过了一段时间我们就不能再这样退回,并且CtrlZ只能按顺序一个一个回…

用QT的modbus相关类编写ModbusTcp主站

目标程序运行界面, 1.新建Qwiget工程,工程文件如下, #------------------------------------------------- # # Project created by QtCreator 2022-09-28T14:53:02 # #------------------------------------------------- QT co…

MYSQL介绍——数据库查询

条件查询 很多时候,我们使用数据库时并不是关心表里所有的数据,而是一部分满足条件的数据,这类条件要用WHERE子 句来实现数据的筛选。 SELECT …… FROM …… WHERE 条件 [ AND | OR ] 条件 …… ;下面给出一个示例: SELECT * …

Android init.rc语言全解析

读懂init语言并不难,难的是有人愿意去做这个事情然后分享出来,如果不是接触到这块的知识,没有谁会专门研究这个,这也是为什么我写第一篇initrc文章到现在过去了7年多了一直没更新的原因,经常有小伙伴私信我希望我写一篇关于init文件解读的文章,或者是想请教下如何在custo…

vue搭建项目、创建登录页面和后台交互之引入axios

目录 1. 搭建项目 1.1 使用vue-cli创建项目 1.2 通过npm安装element-ui 1.3 导入组件 2 创建登录页面 2.1 创建登录组件 2.2 引入css(css.txt) 2.3 配置路由 2.4 在Login组件中将提交按键调整为100%宽度 2.5 运行效果 3. 后台交互 3.1 引入ax…

北京跨境电商开发

受疫情影响,许多国际航班停运,民众只能通过网络购买海外商品。越来越多的商家嗅到了这个商机,于是扩大经营范围。2021年以来,跨境电商投资不断升温,随着SaaS体系的完善,需求也在增加。跨境电商在市场上的潜…

SpringCloud之注册中心

1.SpringCloud电商示例 1.1.示例架构 以常见的电商业务为例 cloud-demo:- order-service # 订单服务- user-service # 用户服务- product-service # 商品服务— cloud-common # 不是应用服务,主要用于存放一些公共的内容,如pojo、baseservice这种、还有utilsc…

冰冰学习笔记:反向迭代器的模拟

欢迎各位大佬光临本文章!!! 还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正。 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位…

06-使用pytorch实现手写数字识别

目录 1.思路和流程分析 2.准备训练集和测试集 2.1 torchvision.transforms的图形数据处理方法 2.1.1 torchvison.transforms.ToTensor 2.1.2 torchvision.transforms.Normalize(mean,std) 2.1.3 torchvision.transforms.Compose(transforms) 2.2 准备MNIST数据集的Datas…

数据结构<5>二叉树和堆——原理+实现

前面所讲到的数据结构比如:顺序表,链表,栈,队列都是属于线性结构,但是到了二叉树这里就是非线性结构了。下面我们先来认识一下什么是树。 文章目录树的概念和结构树的结构树的概念树的表示树的应用二叉树的概念和结构二…

神经网络在控制中的作用,神经网络控制基本原理

什么是神经网络控制 神经网络控制技术是一项复杂的系统控制技术,一般应用在变频器的控制中,它是通过对系统的辨识、运算后对变频器进行控制的一种新技术。 而且神经网络控制可以同时控制多个变频器,所以应用在多个变频器级联控制中比较合适…