二十三种设计模式第十九篇--命令模式

2023-11-17

命令模式是一种行为设计模式,它将请求封装成一个独立的对象,从而允许您以参数化的方式将客户端代码与具体实现解耦。在命令模式中,命令对象充当调用者和接收者之间的中介。这使您能够根据需要将请求排队、记录请求日志、撤销操作等。

命令模式的核心组成部分包括:

命令接口(Command Interface):定义了执行操作的方法。 具体命令(Concrete
Command):实现了命令接口,并将具体的请求与实际的接收者相关联。
调用者(Invoker):接收客户端的请求,并将其转发给具体命令对象。 接收者(Receiver):实际执行操作的对象。

命令模式的优点包括:

  1. 解耦调用者和接收者:调用者无需知道具体执行操作的细节,只需通过命令对象调用相应的方法。
  2. 容易扩展和维护:可以方便地添加新的命令和接收者,因为每个命令都是独立的对象。
  3. 支持撤销和重做操作:由于所有命令都被封装成对象,可以轻松地实现撤销和重做功能。

然而,命令模式也有一些限制和适用场景:

  • 增加了类的数量:每个命令都需要一个具体的命令类,这可能导致系统中类的数量增加。
  • 不适合复杂的命令操作:如果命令需要多个步骤或复杂的逻辑,可能需要使用其他模式来更好地处理。

在这里插入图片描述

public interface Order {
   void execute();
}
public class SellStock implements Order {
   private Stock abcStock;
 
   public SellStock(Stock abcStock){
      this.abcStock = abcStock;
   }
 
   @Override
   public void execute() {
      abcStock.sell();
   }
}
public class Stock {

   private String name = "ABC";
   private int quantity = 10;

   public void buy(){
      System.out.println("股票 [ 公司名: "+name+",数量: " + quantity +" ] 买");
   }

   public void sell(){
      System.out.println("股票 [ 公司名: "+name+",数量: " + quantity +" ] 卖");
   }
}

public class BuyStock implements Order {
   private Stock abcStock;
 
   public BuyStock(Stock abcStock){
      this.abcStock = abcStock;
   }
 
   @Override
   public void execute() {
      abcStock.buy();
   }
}
public class Broker {
   //组装命令
   private List<Order> orderList = new ArrayList<Order>(); 

   //接收命令,存到命令列表中
   public void takeOrder(Order order){
      orderList.add(order);      
   }

   //循环命令列表,逐个执行.
   public void placeOrders(){
      for (Order order : orderList) {
         order.execute();
      }
      orderList.clear();
   }
}
public class CommandPatternDemo {
   public static void main(String[] args) {
      Stock abcStock = new Stock();  //创建股票对象

      //创建命令
      BuyStock buyStockOrder = new BuyStock(abcStock);
      SellStock sellStockOrder = new SellStock(abcStock);

      //按顺序发布股票 买卖 指令
      Broker broker = new Broker();

      broker.takeOrder(buyStockOrder);
      broker.takeOrder(sellStockOrder);

      //统一执行所有的命令
      broker.placeOrders();
   }
}

注意:看得懂代码和写代码是两个概念,写得出高质量代码和写的出代码又是两个概念!!!这话是说给自己本人的,学习当永无止境,从事IT行业者更是如此,经验的积累并非一朝一夕就可以完成的,而是需要不断的尝试,从众多选择中获取最优的选择,这个方才是我从事这份行业中最宝贵的收货,初级-中级-高级是需要一段时间过度的,路在脚下,一个坑一个坑的踩着走,不知道有无踩的终点,但是在一路上将坑一个一个的填平,即便是没有填平的坑下次遇到就小心一点就是了,这方才是我们在这个行业最大的收货。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二十三种设计模式第十九篇--命令模式 的相关文章

  • 设计模式——Visitor(访问者)模式

    目录 前言 1 定义 2 适用性 3 结构 3 1 结构图 3 2 参与者 4 Java实际应用举例 以ASM技术为例 4 1 被访问对象 ClassReader 4 2 Visitor ClassVisitor 4 3 具体visitor
  • python语法(高阶)-设计模式(单例模式)

    参考内容 黑马程序员
  • 离散仿真引擎基础作业与练习

    作业内容 一 简答题 1 解释 GameObjects 和 Assets 的区别与联系 2 下载几个游戏案例 分别总结资源 对象组织的结构 3 使用 debug 验证 MonoBehaviour 基本行为或事件触发条件 4 了解 GameO
  • 设计模式学习笔记(一)之单例模式

    单例模式 作用 保证一个类只有一个实例 并且提供访问这个实例的全局访问点 应用场景有 数据库连接池 spring中 Bean默认是单例 Servlet中 每一个Servlet是单例 配置文件的类 一般是单例 优点 单例只生成一个实例 减少系
  • C++ 装饰器模式

    什么是装饰器模式 装饰器模式是一种结构型设计模式 实现了在不改变现有对象结构的的同时又拓展了新的功能 装饰器本质上是对现有对象的重新包装 同时装饰器又称为封装器 如何理解装饰器模式 以笔记本电脑为例 当我们购买了一台新笔记本电脑 但我们发现
  • 面向过程和面向对象的语言有哪些,以及优缺点(一篇文章让你理解)

    C语言是面向过程的 而C python java是面向对象的 面向过程的编程思想将一个功能分解为一 个一个小的步骤 我们通过完成一个一 个的小的步骤来完成一个程序 优点 这种编程方式 符合我们人类的思维 编写起来相对比较简单 缺点 但是这种
  • 简单工厂模式

    简单工厂模式 一 概念 从设计模式的类型上来说 简单工厂模式是属于创建型模式 又叫做静态工厂方法 StaticFactory Method 模式 但不属于23种GOF设计模式之一 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例 简
  • Java设计模式-装饰者模式Decorator

    介绍 装饰者模式的核心思想是通过创建一个装饰对象 即装饰者 动态扩展目标对象的功能 并且不会改变目标对象的结构 提供了一种比继承更灵活的替代方案 需要注意的是 装饰对象要与目标对象实现相同的接口 或继承相同的抽象类 另外装饰对象需要持有目标
  • 设计模式一之简单工厂模式

    生活示例 刻板印刷 gt 活字印刷举例 喝酒唱歌 人生真爽 gt 对酒当歌 人生几何 可维护 需要修改 则只需要改需要改的字即可 可复用 字体可在后来的印刷复用 可扩展 需要加字 只需要加入相应的刻字即可 灵活性好 字的排列可能竖排或横排
  • 程杰“大话设计模式”中的设计原则

    单一职责原则 SRP 就一个类而言 应该仅有一个引起它变化的原因 如果一个类承担的职责过多 就等于把这些职责耦合在了一起 一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力 这种耦合会导致脆弱的设计 当发生变化时 设计会遭受到意想不到
  • 设计模式 -- 工厂模式(Factory Pattern)

    简单工厂模式 Simple Factory Pattern 根据传入的参数决定实例化哪个对象 优点 不直接在客户端创建具体产品的实例 降低了耦合性 缺点 违反了开闭原则 对扩展开放 对修改关闭 不容易形成高内聚松耦合结构 每当我们增加一种产
  • 设计模式七大原则

    1 设计模式的目的 编写软件过程中 程序员面临着来自耦合性 内聚性以及可维护性 可扩展性 重用性 灵活性 等多方面的挑战 设计模式是为了让程序 软件 具有更好 1 代码重用性 即 相同功能的代码 不用多次编写 2 可读性 即 编程规范性 便
  • 设计模式-2--工厂模式(Factory Pattern)

    一 什么是工厂模式 工厂模式 Factory Pattern 是一种创建型设计模式 它提供了一种创建对象的接口 但是将对象的实例化过程推迟到子类中 工厂模式允许通过调用一个共同的接口方法来创建不同类型的对象 而无需暴露对象的实例化逻辑 工厂
  • 第12课:生活中的构建模式——想要车还是庄园

    用程序来模拟生活 从剧情中思考构建模式 与工厂模式的区别 与组合模式的区别 构建模式的模型抽象 类图 基于升级版的实现 模型说明 应用场景 故事剧情 下周就要过年了 这是 Tony 工作后的第一个春节 还是在离家这么远的北京工作 所以肯定不
  • 外观设计模式

    外观设计模式 根据实际案例分析外观模式 Facade 示例 业务与设计模式落地案例 根据实际案例分析外观模式 Facade 案例 假设一个放电影功能 在播放电影时 需要放下窗帘 打开空调 打开播放机 打开音响 考虑用户观影时间较长时 提供暂
  • Java设计模式之装饰者设计模式Decorator Pattern

    目录 一 基本概念 二 结构 1 图示 三 案例演示 被装饰对象的基类 一个接口 有cost 和description 两个抽象方法 具体被装饰的对象 实现上面这个接口 装饰者抽象类 基类 实现drink接口 具体的装饰者类 糖 具体装饰者
  • 哈工大2020软件构造Lab3实验报告

    本项目于4 21日实验课验收 更新完成 如果有所参考 请点点关注 点点赞GitHub Follow一下谢谢 2020春计算机学院 软件构造 课程Lab3实验报告 Software Construction 2020 Spring Lab 3
  • 设计模式详解---策略模式

    1 策略模式简介 策略模式 Strategy Pattern 是一种行为型设计模式 用于在运行时根据不同的情境选择不同的算法或策略 该模式将算法封装成独立的类 使得它们可以相互替换 而且可以独立于客户端使用它们的方式 1 1 主要角色 上下
  • C++设计模式 #3策略模式(Strategy Method)

    动机 在软件构建过程中 某些对象使用的的算法可能多种多样 经常改变 如果将这些算法都写在类中 会使得类变得异常复杂 而且有时候支持不频繁使用的算法也是性能负担 如何在运行时根据需求透明地更改对象的算法 将算法和对象本身解耦 从而避免上述问题
  • C++设计模式 --1.工厂模式和单例模式

    文章目录 1 工厂模式 简单工厂模式 工厂方法模式 抽象工厂模式 2 单例模式 懒汉式 饿汉式 1 工厂模式 简单工厂模式

随机推荐

  • 解决pandas链式赋值警告SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a .....

    完整报错 opt anaconda3 envs quant learn lib python3 7 site packages pandas core series py 1056 SettingWithCopyWarning A valu
  • Sa-Token框架介绍 转载于链接:https://juejin.cn/post/7000174417846222878 来源:稀土掘金

    Sa Token简介 Sa Token是一款轻量级的Java权限认证框架 可以用来解决登录认证 权限认证 Session会话 单点登录 OAuth2 0 微服务网关鉴权等一系列权限相关问题 框架集成简单 开箱即用 API设计优雅 通过Sa
  • STM32学习(四)GPIO输入检测

    通过检测GPIO输入 让LED灯实现亮灭翻转的效果 跟 三 中类似 首先创建一个bsp key c和bsp key h文件 将与案件有关的宏定义和相应的函数都放在里面 1 首先在User文件夹下添加bsp key c文件 并通过bsp ke
  • ELK学习笔记之logstash安装logstash-filter-multiline(在线离线安装)

    0x00 概述 ELK logstash在搬运日志的时候会出现多行日志 普通的搬运会造成保存到ES中单条单条 很丑 而且不方便读取 logstash filter multiline可以解决该问题 github地址 https github
  • 1037. 在霍格沃茨找零钱(20)

    题目链接 http www patest cn contests pat b practise 1037 1037 在霍格沃茨找零钱 20 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Stand
  • 【源码】10 个 Python 爬虫入门实例!

    今天带伙伴们学习python爬虫 准备了几个简单的入门实例 分享给大家 涉及主要知识点 web是如何交互的 requests库的get post函数的应用 response对象的相关函数 属性 python文件的打开 保存 代码中给出了注释
  • QXlsx编译和使用

    一 概要 QtXlsx是可以读取和写入Excel文件的库 它不需要Microsoft Excel 并且可以在Qt5支持的任何平台下使用 可以用于 从头开始生成新的 xlsx文件 从现有的 xlsx文件中提取数据 编辑现有的 xlsx文件 二
  • Altium Designer19如何查看PCB中有多少焊盘和元件

    在旧版的Altium Designer中 可以通过 Reports gt Board Information 可以看到PCB的相关信息 里面就有焊盘数量 元件数量等等相关信息 但是AD19中 Reports 中没有 Board Inform
  • 机器人教育对思维能力和创新能力有益

    发展人工智能机器人教育 从孩子的思维和技术能力创新上抓起不仅重要而且必须 格物斯坦小坦克认为机器人教育更多的是采用引导的方式 激发孩子们的想法 重在培养孩子的的思维 心理素质以及动手能力 在制作机器人的过程中 孩子需要动手实践锻炼思维逻辑能
  • 2020年06月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

    一 单选题 共25题 每题2分 共50分 第1题 以下哪种输入结果不可能得到以下反馈 重要的事情说三遍 安全第一 安全第一 安全第一 A print 重要事情说三遍 安全第一 3 B print 重要事情说三遍 安全第一 安全第一 2 C
  • Python基础知识总结

    Python基础知识总结 字符串 字符串操作 字符大小写转换 长度填充与删除 string模块函数 进制转换 列表 列表之星操作 字典 字典操作 字符串 字符串操作 序号 分类 函数 方法 描述
  • 编译Linux内核

    一 首先下载好内核源代码 首先在命令行窗口中执行下面这条命令 apt cache search linux source 执行用这条命令系统会提示你安装适合你内核版本的内核源码 然后选择其中一种内核版本 到www kernel org内核官
  • Jenkins持续集成项目实践 —— 基于Python Selenium自动化测试(二)

    上一篇讲了如何搭建jenkins 这篇主要讲 怎么将自动化代码与jenkins衔接起来 jenkins上运行的两种方式 第一种 在jenkins上面运行本地代码 操作如下 新建项目 项目名称根据自己项目情况填写并选择自由模式 进行配置根据如
  • R语言入门教程知识 第二章 赋值代码与命名规则

    快捷键 新建脚本 Ctrl shift N 清理控制台快捷键 Ctrl L 赋值快捷键ALT 赋值法 1 符号方式赋值 对象名 lt 对象值 2 函数方式赋值 assign 对象 对象值 三大基础函数 numeric 数值型向量 logic
  • 上网原理大透析(MAC,IP,掩码,DNS)

    一 概述 1 1 五层模型 互联网的实现 分成好几层 每一层都有自己的功能 就像建筑物一样 每一层都靠下一层支持 用户接触到的 只是最上面的一层 根本没有感觉到下面的层 要理解互联网 必须从最下层开始 自下而上理解每一层的功能 如何分层有不
  • 内联函数的使用及注意点

    内联函数并不总是内联 Inline function是在C 中引入的一种机制 它可以拓展函数代码 避免调用函数的额外开销 在Linux环境下 gcc编译选项必须加上优化选项才能使inline有效 inline与static的关系 在这儿有一
  • Kafka之基础笔记

    1 kafka offset 存储 1 1 去zookeeper依赖 比较广为人知的Kafka offset存储方式为zookeeper 在0 8版本时 默认依然是zk 但是此时其实已经出现另外一种offset存储方式了 Kafka以 co
  • 如何在ios中集成微信登录功能

    在ios中集成微信的登录功能有两种方法 1 用微信原生的api来做 这样做的好处就是轻量级 程序负重小 在Build Settings 中这样设置 然后设置 友盟的设置同上 但是要注意 加入你需要的所有框架到应用程序中
  • VUE3父子组件传值defineProps() 和 defineEmits()

    defineProps 和 defineEmits 都是只能在
  • 二十三种设计模式第十九篇--命令模式

    命令模式是一种行为设计模式 它将请求封装成一个独立的对象 从而允许您以参数化的方式将客户端代码与具体实现解耦 在命令模式中 命令对象充当调用者和接收者之间的中介 这使您能够根据需要将请求排队 记录请求日志 撤销操作等 命令模式的核心组成部分