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

news2024/11/17 22:32:19

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

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

命令模式

定义

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

结构

  • 抽象命令类(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;
    }

    @Override
    public 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.coloradmin.cn/o/1309319.html

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

相关文章

cpp:1:10: fatal error: opencv2/core.hpp: 没有那个文件或目录

前言&#xff1a; 我按照官网方法安装了opencv&#xff0c;运行的也是官网的测试代码&#xff1a; #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> using namespace cv; int main() {printf("hello world")return 0; } 半解决&#xff…

TCP/IP详解——TCP 协议

文章目录 一、传输层协议1. TCP1.1 TCP 的字节流1.2 TCP 端口号1.3 TCP 头部1.4 TCP 选项部分字段1.5 TCP 三次握手1.6 TCP 三次握手不成功1.6.1 TCP 拒绝&#xff08;被RST重置&#xff09;1.6.2 TCP 半连接1.6.3 TCP 连接无响应 1.7 TCP 传输过程及原理1.7.1 TCP 传输过程1.7…

高通开发系列 - 功耗问题之添加CPU Idle和Hotplug的功能

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 返回:专栏总目录 目录 概述CPU IdleCPU TopologyCPU Idle DriverCPU Idle GovernorCPU的hotplug函数

给我说说Redis持久化机制RDB吧

基础 了解过Redis持久化RDB嘛&#xff1f;可不可以解释一下什么是RDB。 答&#xff1a; RDB持久化机制是将内存中的数据生成快照并持久化到磁盘的过程&#xff0c;RDB可以通过手动或者自动的方式实现持久化。 那RDB触发的方式有哪几种方式知道吗&#xff1f; 答: 有两种&am…

【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统(三)日志管理(登录日志、操作日志)、用户登录模块

第一篇&#xff1a;【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统&#xff08;一&#xff09;搭建项目 第二篇&#xff1a;【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统&#xff08;二&#xff09;日志输出中间件、校验token中间件、配置路由、基础工具函数。 …

赛氪为第五届全球校园人工智能算法精英大赛决赛选手保驾护航

12月10日&#xff0c;以“智青春算未来”为主题的2023年第五届全球校园人工智能算法精英大赛全国总决赛在河海大学江宁校区举行。本次大赛由江苏省人工智能学会主办&#xff0c;自9月份启动以来&#xff0c;共吸引了全国近400所高校的3000多支参赛团队参加。经过校赛、省赛选拔…

Linux(统信UOS) 发布.Net Core,并开启Https,绑定证书

实际开发中&#xff0c;有时会需要为小程序或者需要使用https的应用提供API接口服务&#xff0c;这就需要为.Net Core 配置https&#xff0c;配置起来很简单&#xff0c;只需要在配置文件appsettings.json中添加下面的内容即可 "Kestrel": {"Endpoints": …

LeetCode力扣每日一题(Java)66、加一

每日一题在昨天断开了一天&#xff0c;是因为作者沉迷吉他&#xff0c;无法自拔……竟然把每日一题给忘了&#xff0c;所以今天&#xff0c;发两篇每日一题&#xff0c;把昨天的给补上 一、题目 二、解题思路 1、我的思路 其实乍一看这道题还是比较简单的&#xff0c;就是让…

C/C++ 汇总区间-返回恰好覆盖数组中所有数字的最小有序区间范围列表

给定一个无重复元素的有序数数组ums。返回恰好覆盖数组中所有数字的最小有序区间范围列表。 也就是说&#xff0c;nums 的每个元素都恰好被某个区间范围所覆盖&#xff0c;并且不存在属于某个范围但不属于 nums 的数字x。 列表中的每个区间范围 [a,b] 应该按如下格式输出&…

zabbix——实现高效网络监控

在当今的数字化时代&#xff0c;网络和服务器的健康状况对于企业的正常运营至关重要。为了及时发现和解决潜在的问题&#xff0c;许多企业选择使用网络监控工具来追踪服务器的性能和网络参数。其中&#xff0c;Zabbix是一个功能强大且开源的网络监控工具&#xff0c;被广泛应用…

unity 2d 入门 飞翔小鸟 死亡闪烁特效(十三)

一、c#脚本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Bling : MonoBehaviour {public Texture img;public float speed;public static bool changeWhite false;private float alpha0f;// Start is called before the fi…

EasyRecovery(数据恢复软件) 2024中文绿色无需激活版下载

EasyRecovery是一款功能强大且专业的数据恢复软件&#xff0c;软件能够对电脑误删的文件进行恢复&#xff0c;包括格式化硬盘是数据恢复、手机U盘数据恢复等&#xff0c;小编今天给大家带来的是根据官软件解压后直接使用。感兴趣的朋友快来下载使用吧。 EasyRecovery-2024mac最…

PCL显示double类型的点云方案

前言 我们知道&#xff0c;PCL和OpenGL等三维可视化软件一样&#xff0c;为了兼顾性能需求&#xff0c;只支持加载Float类型的点云数据&#xff0c;但是当我们对精度要求太高时&#xff0c;Float类型支持不了我们的精度要求&#xff0c;我们的数据必须用Double类型存储才可以&…

Vue 3 开发中遇到的问题及解决方案(fix bug)

开发环境&#xff1a;mac系统&#xff0c;node版本&#xff1a; 16.15.0 版本兼容问题 vite v3.2.4 building for development... hasInjectionContext is not exported by node_modules/pinia/node_modules/vue-demi/lib/index.mjs, imported by node_modules/pinia/dist/pini…

【MySQL命令】show slave status\G 超详细全面解释

这个命令是DBA日常运维中常用来查看主从状态的命令&#xff0c;很多备份&#xff0c;监控工具也会使用到该命令监控主从状态是否正常&#xff0c;主从延迟&#xff0c;获取位点信息等。作为常用日常命令&#xff0c;一定要完全理解该命令的输出。今天主要结合 官方文档 和 实际…

AndroidStudio使用小技巧(持续更新中)

改过一次后&#xff0c;当时还记着&#xff1b;再拿起来&#xff0c;就忘记了。还是记下来吧。 使用鼠标滚轮设置文本的字体大小 左上角 File->Setting->Editor 启动时设置是否自动打开项目 老版本AS会有 Reopen last project on startup新版本AS有 Reopen projects o…

Stable Diffusion - High-Resolution Image Synthesis with Latent Diffusion Models

Paper name High-Resolution Image Synthesis with Latent Diffusion Models Paper Reading Note Paper URL: https://arxiv.org/abs/2112.10752 Code URL: https://github.com/CompVis/latent-diffusion TL;DR 2021 年 runway 和慕尼黑路德维希马克西米利安大学出品的文…

《从入门到精通:AJAX基础知识解析,前端开发中利器》基础篇

目录 学习目标&#xff1a; 学习目录&#xff1a; 学习时间&#xff1a; 学习内容&#xff1a; 什么是 AJAX&#xff1f; 怎么用 AJAX &#xff1f; 认识 URL 协议 域名 资源路径 获取 - 新闻列表 URL 查询参数 axios&#xff0d;查询参数 常用请求方法和数据提…

【docker】镜像使用(Nginx 示例)

查看本地镜像列表 docker images删除本地镜像 # docker rmi [容器 ID]docker rmi a6bd71f48f68 查找镜像 docker search nginx 参数介绍 NAME: 镜像仓库源的名称DESCRIPTION: 镜像的描述OFFICIAL: 是否 docker 官方发布STARS: 点赞、喜欢AUTOMATED: 自动构建。 拉去镜像 …

动态雨滴个人主页导航页

资源入口 动态雨滴玻璃掉落主页&#xff0c;和之前的两个一个性质&#xff0c;css全部重构&#xff0c;canvas绘制的下雨背景&#xff0c;可以自己去换图片。 原版&#xff1a; 已二次开发&#xff08;可添加多个导航格及自适应手机端&#xff09; ------本页内容已结束&#x…