【设计模式--行为型--命令模式】

设计模式--行为型--命令模式

    • 命令模式
      • 定义
      • 结构
      • 案例
      • 优缺点
      • 使用场景

命令模式

定义

将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储,传递,调用,增加与管理。

结构

  • 抽象命令类(Command)角色:定义命令的接口,声明执行的方法。
  • 具体命令(Concrete Command)角色:具体的命令,实现命令接口;通常会持有接收者,并调用接受者的功能来完成命令要执行的操作。
  • 接收者(Receiver)角色:接收者,真正执行命令的对象。任何一个类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
  • 请求者(Invoke)角色:要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个使客户端真正出发命令并要求命令执行相应操作的地方,也就是相当于使用命令对象的入口。

案例

饭店点餐:顾客把订单给服务员,服务员把订单给厨师,厨师做菜。

  • 服务员:请求者,由她向厨师发起命令
  • 厨师:接收者,真正执行命令的对象
  • 订单:命令中包含订单
    类图:
    在这里插入图片描述
/*** 抽象命令类*/
public interface Command {void execute();
}
/*** 具体命令类*/
public class OrderCommand implements Command{// 持有接收者对象private SeniorChef seniorChef;private Order order;public OrderCommand(SeniorChef seniorChef, Order order) {this.seniorChef = seniorChef;this.order = order;}@Overridepublic void execute() {System.out.println(order.getDiningTable() + "卓的订单:");Map<String, Integer> foodDir = order.getFoodDir();Set<String> keys = foodDir.keySet();for (String foodName : keys){seniorChef.makeFood(foodName,foodDir.get(foodName));}System.out.println(order.getDiningTable() + "卓的饭好了---");}
}
/*** 订单类*/
public class Order {// 餐桌号码private int diningTable;// 餐品及数量private Map<String, Integer> foodDir = new HashMap<>();public int getDiningTable() {return diningTable;}public void setDiningTable(int diningTable) {this.diningTable = diningTable;}public Map<String, Integer> getFoodDir() {return foodDir;}public void setFoodDir(Map<String, Integer> foodDir) {this.foodDir = foodDir;}public void setFood(String name, int num) {foodDir.put(name, num);}
}
/*** 厨师类*/
public class SeniorChef {public void makeFood(String name, int num){System.out.println(num+"份"+name);}
}
/*** 服务员角色  请求者*/
public class Waitor {// 持有多个命令private List<Command> commands = new ArrayList<>();public List<Command> getCommands() {return commands;}public void setCommands(Command command) {commands.add(command);}// 发起命令的方法public void orderUp(){System.out.println("服务员说:新订单来了");for (Command command : commands) {if (command != null){command.execute();}}}
}
public class Test01 {public static void main(String[] args) {// 订单对象Order order = new Order();order.setDiningTable(1);order.setFood("炒土豆丝",1);order.setFood("可乐",1);Order order1 = new Order();order1.setDiningTable(2);order1.setFood("面条", 1);// 厨师对象SeniorChef seniorChef = new SeniorChef();// 创建命令对象OrderCommand orderCommand = new OrderCommand(seniorChef, order);OrderCommand orderCommand1 = new OrderCommand(seniorChef, order1);// 创建调用者,服务员Waitor waitor = new Waitor();waitor.setCommands(orderCommand);waitor.setCommands(orderCommand1);// 发起命令waitor.orderUp();}
}

在这里插入图片描述

优缺点

  • 优点
    • 降低系统的耦合度。命令模式能将调用操作的对象与实现该操作的对象解耦。
    • 增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类,满足开闭原则,对扩展比较灵活。
    • 可以实现宏命令。命令模式可以与组合模式结合,将多个命令装配成一个组合命令,即宏命令。
    • 方便实现Undo和Redo操作。命令模式可以与备忘录模式结合,实现命令的撤销与恢复。
  • 缺点
    • 使用命令模式可能会导致某些系统有过多的具体命令类。
    • 系统结构更加复杂。

使用场景

  • 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
  • 系统需要在不同的时间指定请求,将请求排队和执行请求。
  • 系统需要支持命令的撤销操作和恢复操作。

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

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

相关文章

Springboot整合Redis实现消息发布订阅

一、前言 有时候在实际项目中&#xff0c;某些业务场景下我们需要使用消息的发布订阅功能&#xff0c;以实现某些特殊的需求&#xff0c;那么我们实际上可以有多种选择&#xff0c;比如使用常见的消息中间件Rabbitmq&#xff0c;Kafka&#xff0c;Activemq等&#xff0c;但这几…

Nodejs 第二十四章(zlib)

在 Node.js 中&#xff0c;zlib 模块提供了对数据压缩和解压缩的功能&#xff0c;以便在应用程序中减少数据的传输大小和提高性能。该模块支持多种压缩算法&#xff0c;包括 Deflate、Gzip 和 Raw Deflate。 zlib 模块的主要作用如下&#xff1a; 数据压缩&#xff1a;使用 z…

07--面向对象OOP--02

学习面向对象内容的三条主线 Java类及类的成员&#xff1a;&#xff08;重点&#xff09;属性、方法、构造器&#xff1b;&#xff08;熟悉&#xff09;代码块、内部类面向对象的特征&#xff1a;封装、继承、多态、&#xff08;抽象&#xff09;其他关键字的使用&#xff1a;…

城轨线路列车时刻表与车站客流控制协同优化方法

文章信息 论文题目为《城轨线路列车时刻表与车站客流控制协同优化方法》&#xff0c;该文于2021年发表于《交通运输系统工程与信息》上。文章考虑换入客流影响下列车时刻表与客流控制的协同优化问题&#xff0c;以最小化乘车延误人数为目标&#xff0c;以列车时刻表、客流控制和…

前端成神之路-CSS基础选择器

前端成神之路-CSS基础选择器 目录 前端成神之路-CSS基础选择器 CSS选择器&#xff08;重点&#xff09; 1. CSS选择器作用&#xff08;重点&#xff09; 选择器的作用 2. CSS基础选择器 2.1 标签选择器 2.2 类选择器 2.3 类选择器特殊用法- 多类名 2.4 id选择器 id选…

java代码编写twitter授权登录

在上一篇内容已经介绍了怎么申请twitter开放的API接口。 下面介绍怎么通过twitter提供的API&#xff0c;进行授权登录功能。 开发者页面设置 首先在开发者页面开启“用户认证设置”&#xff0c;点击edit进行信息编辑。 我的授权登录是个网页&#xff0c;并且只需要进行简单的…

动物姿态估计:微调 YOLOv8 姿态模型

动物姿态估计是计算机视觉的一个研究领域&#xff0c;是人工智能的一个子领域&#xff0c;专注于自动检测和分析图像或视频片段中动物的姿势和位置。目标是确定一种或多种动物的身体部位&#xff08;例如头部、四肢和尾巴&#xff09;的空间排列。这项技术具有广泛的应用&#…

目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】边缘检测(附MATLAB代码实现)

目录 前言 知识储备 数字图像处理(Digital Image Processing) 数字图像处理基础知识与算法

子组件调用父组件的方法

在React中使用函数组件&#xff08;也称为无状态组件&#xff09;和Hooks时&#xff0c;你可以通过以下方式让子组件调用父组件的方法&#xff1a; 1. 使用回调函数&#xff08;Callback Function&#xff09; 这是最常见的方法。当子组件需要调用父组件的方法时&#xff0c;…

uniapp 单选按钮 选中默认设备

需求1&#xff1a;选中默认设备&#xff0c;113 和114 和139都可以选中一个默认设备 选中多个默认设备方法&#xff1a; async toSwitch(typeItem, title) {const res await this.setDefaultDev(typeItem.ibdr_devsn, typeItem.ibdr_pid)if (!res) {this.common.toast(切换默…

关于在Java中打印三角形图形的汇总

前面写过一些关于打印三角形图形代码的文章&#xff0c;这里进行了汇总&#xff0c;话不多说&#xff0c;直接上代码&#xff1a; /*** 关于打印三角形的汇总*/ public class Work1 {public static void main(String[] args) {int num 5;/** 打印如下图形&#xff1a;* ** …

OPCServer KEPServer安装和使用

OPCServer KEPServer安装和使用 简介 KEPServer软件是免费的&#xff0c;驱动收费&#xff0c;每天2小时试用时间, 免费用来模拟仿真是很不错的选择 OPC DA 和OPC UA都支持 中文官网地址: https://www.kepware.com/zh-cn/ 中文官方文档&#xff08;经常有更新&#xff0c;其…

分库分表及ShardingShpere-proxy数据分片

为什么需要分库&#xff1f; 随着数据量的急速上升&#xff0c;单个数据库可能会QPS过高导致读写耗时过长而出现性能瓶颈&#xff0c;所以需要考虑拆分数据库&#xff0c;将数据库分布在不同实例上提升数据库可用性。主要的原因有如下&#xff1a; 磁盘存储。业务量剧增&…

Vite + React + tailwindcss + ts + 多Nodejs环境... 速搭

最近接触了前端代码&#xff0c;作为一个后端&#xff0c;能将其搭起来并用于生产&#xff0c;我感到很是欣慰。 本文纯安装速记与关键点记录&#xff0c;适合有一定经验且对前端React及生态有一些小了解&#xff0c;想要快速的将一个框架搭建起来的童鞋。可当成一个指引。 N…

华为OD机试 - 高效货运(Java JS Python C)

题目描述 老李是货运公司承运人,老李的货车额定载货重量为 wt。 现有两种货物: 货物 A 单件重量为 wa,单件运费利润为 pa货物 B 单件重量为 wb,单件运费利润为 pb老李每次发车时载货总重量刚好为货车额定的载货重量 wt,车上必须同时有货物 A 和货物 B ,货物A、B不可切割…

javaWebssh汽车销售管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh汽车销售管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT7.…

redis-学习笔记(Jedis zset 简单命令)

zadd & zrange zadd , 插入的第一个参数是 zset , 第二个参数是 score, 第三个参数是 member 成员 内部依据 score 排序 zrange 返回 key 对应的 对应区间内的值 zrangeWithScore 返回 key 对应的 对应区间内的值和分数 示例代码 zcard 返回 key 对应的 zset 的长度 示例代…

05-命令模式

意图&#xff08;GOF定义&#xff09; 将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户端进行参数化&#xff0c;对请求排队或者记录日志&#xff0c;以及可支持撤销的操作。 理解 命令模式就是把一些常用的但比较繁杂的工作归类为成一组一组的动作&…

旅游管理虚拟情景实训教学系统演示

首先&#xff0c;虚拟情景实训教学系统为旅游管理专业的学生提供了一个全新的实践平台。在传统的旅游管理教学中&#xff0c;学生往往只能通过理论学习来了解相关知识&#xff0c;而无法亲身实践。虚拟情景实训教学系统则可以通过模拟真实的旅游场景&#xff0c;让学生能够亲身…

Linux环境下maven的安装

到官网下载maven 步入下面的地址选择合适的maven版本 https://dlcdn.apache.org/maven/ 以笔者为例&#xff0c;选择了3.5.4这个版本 将maven上传到Linux服务器并解压 tar -zxvf apache-maven-3.5.4-bin.tar.gz配置环境变量 我们使用vim编辑profile vim /etc/profile环境…