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

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(使用前将#替换为@)

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

  • c++享元模式

    享元模式 1 享元模式简介 享元模式在 设计模式 可复用面向对象软件的基础 一书中是这样说的 运用共享技术有效地支持大量细粒度的对象 本质就是对大量细粒度的对象进行共享 不是每个对象都要通过new的方式去创建 而是通过区分对象的内部状态和外
  • 设计模式三: 代理模式(Proxy) -- JDK的实现方式

    简介 代理模式属于行为型模式的一种 控制对其他对象的访问 起到中介作用 代理模式核心角色 真实角色 代理角色 按实现方式不同分为静态代理和动态代理两种 意图 控制对其它对象的访问 类图 实现 JDK自带了Proxy的实现 下面我们先使用JD
  • C++设计模式(二)观察者模式

    1 观察者模式知识点 1 定义 定义对象间的一种一对多的依赖关系 当一个对象的状态发生改变的时候 所有依赖它的对象都得到通知并自动更新 2 动机 将一个系统分割成一系列相互协作的类有一个常见的副作用 需要维护相关对象间的一致性 我们不希望为
  • 设计模式的 C++ 实现---工厂方法模式(二)

    前文回顾 单例模式 一 单例模式 二 观察者模式 简单工厂模式 工厂方法模式 一 前言 对于工厂方法模式 当增加新产品时 也需要对应增加一个工厂类 可以使用模版进行封装 减少代码工作量 实现举例 产品抽象基类 class Animal pu
  • Java设计模式:装饰者模式(Decorator Pattern)

    装饰者模式 涉及的重要设计原则 类应该对扩展开放 对修改关闭 装饰者模式定义 装饰者模式动态地将责任附加到对象上 若要扩展功能 装饰者提供了比继承更有弹性的替代方案 UML类图 装饰者模式事例 咖啡店 咖啡种类 1 深焙咖啡 DarkRoa
  • java需会(转载)

    一 基础篇 1 1 Java基础 面向对象的特征 继承 封装和多态 final finally finalize 的区别 Exception Error 运行时异常与一般异常有何异同 请写出5种常见到的runtime exception i
  • 设计模式——导论

    作为软件开发人员 我们在平时工作的过程中 往往需要编写很多的代码来实现我们的需求 很多的时候会造成代码臃肿和代码冗余的情况 这个时候我们需要引入一个理念 设计模式 设计模式存在的意义在于 1 使得我们的代码更加精炼 2 使我们代码的可读性更
  • 设计模式学习之装饰器模式

    装饰器 Decorator 模式跟适配器 Adapter 模式一样 属于构建型设计模式 在学习适配器模式的时候说过 适配器模式的重点在复用能力 装饰器模式的重点在扩展能力 换言之 装饰器模式是先复用后扩展 这也导致了很多人跟适配器模式混淆
  • 程杰“大话设计模式”中的设计原则

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

    Part1Guarded Suspension 模式的介绍 我们只从字面上看 Guarded Suspension 是受保护暂停的意思 1Guarded Suspension 模式 在实际的并发编程中 Guarded Suspension
  • 设计模式七大原则

    1 设计模式的目的 编写软件过程中 程序员面临着来自耦合性 内聚性以及可维护性 可扩展性 重用性 灵活性 等多方面的挑战 设计模式是为了让程序 软件 具有更好 1 代码重用性 即 相同功能的代码 不用多次编写 2 可读性 即 编程规范性 便
  • 每日一问:你想如何破坏单例模式?

    前言 1 单例是什么 单例模式 是一种创建型设计模式 目的是保证全局一个类只有一个实例对象 分为懒汉式和饿汉式 所谓懒汉式 类似于懒加载 需要的时候才会触发初始化实例对象 而饿汉式正好相反 项目启动 类加载的时候 就会创建初始化单例对象 1
  • Java设计模式之装饰者设计模式Decorator Pattern

    目录 一 基本概念 二 结构 1 图示 三 案例演示 被装饰对象的基类 一个接口 有cost 和description 两个抽象方法 具体被装饰的对象 实现上面这个接口 装饰者抽象类 基类 实现drink接口 具体的装饰者类 糖 具体装饰者
  • DDD专家张逸:构建领域驱动设计知识体系

    张逸 读完需要 5分钟 速读仅需 2 分钟 领域驱动设计专家 曾就职于 ThoughtWorks 作为 Lead Consultant 为客户提供架构设计 大数据分析 持续交付 代码质量 敏捷管理等咨询服务 著译作包括 软件设计精要与模式
  • 设计模式(2)

    2 2 结构型模式 结构型模式一共有七种 其中 适配器模式和装饰模式统称为包装模式 装饰模式和代理模式的类图基本相同 但目的不同 这些有相似目的或者有相似结构的模式需要对其概念辨析清楚 才能较好地掌握 下面将对结构型模式分别进行介绍 2 2
  • QT实现四则运算计算器

    include widget h include ui widget h Widget Widget QWidget parent QWidget parent ui new Ui Widget ui gt setupUi this thi
  • 设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)

    原创 疯狂的狮子Li 狮子领域 程序圈 2023 12 19 10 30 发表于辽宁 原型模式 原型模式 Prototype模式 是指 用原型实例指定创建对象的种类 并且通过拷贝这些原型 创建新的对象 原型模式是一种创建型设计模式 允许一个
  • 设计模式(三)-结构型模式(4)-组合模式

    一 为何需要组合模式 Composite 在代码设计中 有种情况是对象之间存在层次关系 即对象之间会存在父结点和子结点的关系 比如在文件管理系统中 所有文件和文件夹形成树状结构 文件夹目录里存在子文件夹和文件 文件夹属于枝结点 文件属于叶结
  • C++设计模式 #3策略模式(Strategy Method)

    动机 在软件构建过程中 某些对象使用的的算法可能多种多样 经常改变 如果将这些算法都写在类中 会使得类变得异常复杂 而且有时候支持不频繁使用的算法也是性能负担 如何在运行时根据需求透明地更改对象的算法 将算法和对象本身解耦 从而避免上述问题
  • 【设计模式之美】 SOLID 原则之五:依赖反转原则:将代码执行流程交给框架

    文章目录 一 控制反转 IOC 二 依赖注入 DI 三 依赖注入框架 DI Framework 四 依赖反转原则 DIP 一 控制反转 IOC 通过一个例子来看一下 什么是控制反转 public class UserServiceTest

随机推荐

  • 解决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 都是只能在
  • 二十三种设计模式第十九篇--命令模式

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