GPT带我学-设计模式-命令模式

2023-11-15

1 你知道设计模式的命令模式吗

是的,我知道设计模式中的命令模式。命令模式是一种行为型设计模式,它将请求封装成一个对象,从而允许使用不同的请求、队列或日志来参数化其他对象。命令模式还支持撤销操作,并且可以提供事务的实现。

在命令模式中,有四个主要的参与对象:命令接口(Command)、具体命令(ConcreteCommand)、命令发起者(Invoker)和命令执行者(Receiver)。命令接口充当了命令的抽象,并声明了执行命令的方法。具体命令实现了命令接口,并具体实现了命令的执行逻辑。命令发起者持有一个命令对象,并可以调用命令对象的执行方法,从而触发命令的执行。命令执行者实际执行命令的操作。

命令模式的优点包括:解耦命令发起者和命令执行者、简化命令的撤销和重做、支持事务等。它可以帮助我们将请求和执行解耦,并且可以提供更好的灵活性和可扩展性。

2 命令模式有几种形式

命令模式主要有三种形式:简单命令模式、宏命令模式和撤销操作命令模式。

简单命令模式(Simple Command Pattern):简单命令模式是命令模式最基本的形式。它只包含一个命令接口和多个具体命令类。每个具体命令类都实现了命令接口,并实现了自己的执行逻辑。命令发起者只需要持有一个命令接口的引用,并通过调用命令接口的方法来触发命令的执行。

宏命令模式(Macro Command Pattern):宏命令模式将多个命令封装为一个宏命令,从而实现一次性执行多个命令。宏命令本身也是一个具体命令,它持有多个其他具体命令的引用,并在执行时依次调用这些命令的执行方法。宏命令模式可以将多个原子操作组合成一个更高级的操作。

撤销操作命令模式(Undo Command Pattern):撤销操作命令模式在简单命令模式的基础上加入了撤销操作的支持。每个具体命令类都需要提供一个撤销方法,在调用撤销方法时可以回滚该命令的执行。撤销操作命令模式可以用于实现撤销和重做功能,使得用户可以取消一系列操作的执行。

这些形式不是互斥的,可以根据具体的需求和场景选择适合的命令模式形式。

3 请你用java写一个简单命令模式具体的例子

当然可以!下面是一个简单的Java代码示例,演示了简单命令模式的实现:

// 定义命令接口
interface Command {
    void execute();
}

// 具体命令类
class ConcreteCommand implements Command {
    private Receiver receiver;
    
    public ConcreteCommand(Receiver receiver) {
        this.receiver = receiver;
    }
    
    // 实现命令接口的执行方法
    public void execute() {
        receiver.action();
    }
}

// 接收者类
class Receiver {
    public void action() {
        System.out.println("Receiver执行命令!");
    }
}

// 命令发起者类
class Invoker {
    private Command command;
    
    public void setCommand(Command command) {
        this.command = command;
    }
    
    public void executeCommand() {
        command.execute();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        // 创建接收者对象
        Receiver receiver = new Receiver();
        
        // 创建具体命令对象,并将接收者传递给它
        Command command = new ConcreteCommand(receiver);
        
        // 创建命令发起者对象,并设置命令对象
        Invoker invoker = new Invoker();
        invoker.setCommand(command);
        
        // 执行命令
        invoker.executeCommand();
    }
}

在上面的示例中,Command接口定义了命令的执行方法execute()。具体命令类ConcreteCommand实现了Command接口,并在execute()方法中调用了接收者对象的action()方法执行具体的命令操作。命令发起者类Invoker持有一个Command对象,并在executeCommand()方法中调用命令对象的execute()方法来触发命令的执行。

运行以上代码,输出结果为:

Receiver执行命令!

这表明成功执行了命令模式,命令发起者通过调用命令对象的方法,将命令传递给接收者并执行了相关操作。

4 你这个例子还是太抽象了,请举一个生活中具体的例子

当然!让我们来看一个更具生活化的例子——简单命令模式在餐厅点餐系统中的应用。

首先,我们定义一个命令接口Order,其中包含了一个执行命令的方法execute():

public interface Order {
    void execute();
}

然后,我们实现具体的命令类,比如CookOrder、ServeOrder和CancelOrder:

public class CookOrder implements Order {
    private Chef chef;
    
    public CookOrder(Chef chef) {
        this.chef = chef;
    }
    
    public void execute() {
        chef.cook();
    }
}

public class ServeOrder implements Order {
    private Waiter waiter;
    
    public ServeOrder(Waiter waiter) {
        this.waiter = waiter;
    }
    
    public void execute() {
        waiter.serve();
    }
}

public class CancelOrder implements Order {
    private Cashier cashier;
    
    public CancelOrder(Cashier cashier) {
        this.cashier = cashier;
    }
    
    public void execute() {
        cashier.cancel();
    }
}

在这个例子中,CookOrder是具体的烹饪命令,ServeOrder是具体的上菜命令,CancelOrder是具体的取消订单命令。

接下来,我们定义几个接收者类,比如Chef、Waiter和Cashier,它们都具有相应的操作:

public class Chef {
    public void cook() {
        System.out.println("厨师正在烹饪订单...");
    }
}

public class Waiter {
    public void serve() {
        System.out.println("服务员正在上菜...");
    }
}

public class Cashier {
    public void cancel() {
        System.out.println("收银员正在取消订单...");
    }
}

最后,我们定义命令发起者类OrderInvoker,它持有一个Order对象,并在调用execute()方法时触发命令的执行:

public class OrderInvoker {
    private Order order;
    
    public OrderInvoker(Order order) {
        this.order = order;
    }
    
    public void executeOrder() {
        order.execute();
    }
}

现在,我们可以使用上述类来模拟餐厅点餐的场景。例如,在点餐系统中,当一个顾客确定要点餐后,服务员会将顾客的订单交给厨师,并通知收银员进行结算

public class RestaurantClient {
    public static void main(String[] args) {
        Chef chef = new Chef();
        Waiter waiter = new Waiter();
        Cashier cashier = new Cashier();
        
        Order cookOrder = new CookOrder(chef);
        Order serveOrder = new ServeOrder(waiter);
        Order cancelOrder = new CancelOrder(cashier);
        
        OrderInvoker invoker = new OrderInvoker(cookOrder);
        invoker.executeOrder();
        
        invoker = new OrderInvoker(serveOrder);
        invoker.executeOrder();
        
        invoker = new OrderInvoker(cancelOrder);
        invoker.executeOrder();
    }
}

当我们运行以上代码时,控制台将会输出:

厨师正在烹饪订单...
服务员正在上菜...
收银员正在取消订单...

这个例子中,顾客点餐后,服务员将不同的订单给相应的接收者(厨师、服务员和收银员),通过简单命令模式实现了对不同操作的封装和执行。

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

GPT带我学-设计模式-命令模式 的相关文章

  • 设计模式的 C++ 实现---工厂方法模式(二)

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

    一 背景 在面向对象程序设计过程中 有时会面临要创建大量相同或相似对象实例的问题 创建那么多的对象将会耗费很多的系统资源 它是系统性能提高的一个瓶颈 例如 围棋和五子棋中的黑白棋子 图像中的坐标点或颜色 局域网中的路由器 交换机和集线器 教
  • [C++]备忘录模式

    备忘录模式 Memento Pattern 保存一个对象的某个状态 以便在适当的时候恢复对象 备忘录模式属于行为型模式 github源码路径 https github com dangwei 90 Design Mode 此文件包含 mai
  • Java并发编程之设计模式

    同步模式之保护性暂停 1 定义 即 Guarded Suspension 用在一个线程等待另一个线程的执行结果 要点 有一个结果需要从一个线程传递到另一个线程 让他们关联同一个 GuardedObject 如果有结果不断从一个线程到另一个线
  • 设计模式(十)装饰器模式

    装饰器模式是一种非常有用的结构型模式 它允许我们在不改变类的结果的情况下 为类添加新的功能 我们来举例说明一下 首先添加一组形状 它们都实现了形状接口 public interface Shape String getShape class
  • 设计模式(5)-适配器模式(Adapter Pattern)

    适配器模式 Adapter Pattern 顾名思义 就像变压器 转接头差不多 就像美国的生活电压是110V 中国是220V 就需要一个变压器将220V转换成110V 或者一个Type C接口想插如USB接口的东西 你就需要一个转换器 而这
  • 设计模式--提供者模式provider

    设计模式 C 提供者模式 Provider Pattern 介绍 为一个API进行定义和实现的分离 示例 有一个Message实体类 对它的操作有Insert 和Get 方法 持久化数据在SqlServer数据库中或Xml文件里 根据配置文
  • linux内核中的设计模式

    创建型 Object Pool Object Pool模式可以提升性能 尤其是在对象的分配 初始化成本高 使用频率高 但使用时间短的情况下 对象池可以设置对象池的大小和回收时间缓存预分配的对象 NT和Linux都有简单的预分配缓存对象的机制
  • 设计模式学习笔记-工厂模式

    设计模式学习笔记 工厂模式 作用 实现了创建者和调用者的分离 详细分类 简单工厂模式 用来生产同一等级结构中的任意产品 对于增加新的产品 必须要扩展已有的代码 工厂方法模式 用来生产同一等级结构中的固定产品 支持增加任意产品 抽象工厂模式
  • 文心千帆为你而来

    1 前言 3月16号百度率先发布了国内第一个人工智能大语言模型 文心一言 文心一言的发布在业界引起了不小的震动 而文心一言的企业服务则由文心千帆大模型平台提供 文心千帆大模型平台是百度智能云打造出来的一站式大模型开发与应用平台 提供包括文心
  • 设计模式之访问者模式

    访问者模式 把被操作的对象作为元素 可变可拓展的操作作为访问者 可以说访问者中有很多操作 然后访问者访问元素 对该元素进行操作 不同的访问者有不同的操作 案例 定义访问者接口 public interface UniversalVisito
  • 哈工大2020软件构造Lab3实验报告

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

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

    一 什么是策略模式 简单来说 策略模式是将每一个算法封装到拥有共同接口的不同类中 使得算法可以在不影响客户端的情况下发生变化 也可以理解为可供程序运行时选择的 不同的类 不同的解决方案 策略模式的特点 高内聚低耦合 可扩展 遵循ocp原则
  • 设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)

    原创 疯狂的狮子Li 狮子领域 程序圈 2023 12 19 10 30 发表于辽宁 原型模式 原型模式 Prototype模式 是指 用原型实例指定创建对象的种类 并且通过拷贝这些原型 创建新的对象 原型模式是一种创建型设计模式 允许一个
  • 设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)

    原创 疯狂的狮子Li 狮子领域 程序圈 2023 12 19 10 30 发表于辽宁 原型模式 原型模式 Prototype模式 是指 用原型实例指定创建对象的种类 并且通过拷贝这些原型 创建新的对象 原型模式是一种创建型设计模式 允许一个
  • C++设计模式 #3策略模式(Strategy Method)

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

    一 单例设计模式 1 1 概述 单例模式 Singleton Pattern 是Java中最简单的设计模式之一 这种类型的设计模式属于创建者模式 它提供了一种创建对象的最佳方式 这种模式涉及到一个单一的类 该类负责创建自己的对象 同时确保只
  • 2023 年精选:每个 DevOps 团队都应该了解的 5 种微服务设计模式

    微服务彻底改变了应用程序开发世界 将大型整体系统分解为更小 更易于管理的组件 这种架构风格的特点是独立 松散耦合的服务 带来了从可扩展性 模块化到更高的灵活性等众多优势 DevOps 团队如何最好地利用这种方法来实现最高效率 答案在于理解并
  • 如何用GPT进行论文润色与改写?

    详情点击链接 如何用GPT GPT4进行论文润色与改写 一OpenAI 1 最新大模型GPT 4 Turbo 2 最新发布的高级数据分析 AI画图 图像识别 文档API 3 GPT Store 4 从0到1创建自己的GPT应用 5 模型Ge

随机推荐

  • vue项目中如何设置ico图标

    在vue项目开发中往往会设计到浏览器头部图标的设置 这里分享一下自己在项目中的使用的方法 如有不足的地方还望指正 直奔主题 1 首先如何制作ico图标 本人使用的是比特虫在线制作ico图标 使用方法很简单直接导入照片 输入生产码 点击生成i
  • springboot (2.0) 设置监听器,过滤器,拦截器

    springboot 2 0 设置监听器 过滤器 拦截器 github springboot2 0 项目名 springboot filter 1 项目结构和配置顺序 1 1配置顺序 listener WebListener声明为liste
  • 自己总结的数据库系统概论笔记,需要的拿去用

    1 绪论 1 1 概念 数据库系统包含 数据库 数据库管理系统 数据库管理员 应用系统 数据库 数据库是长期存储在计算机内 有组织的 可共享的大量数据的集合 数据库中的数据按照一定的数据模型 组织 描述和储存 具有较小的冗余度 较高的数据独
  • Angular --官方文档使用 Angular CLI创建项目

    1 在node环境下 标配 node v npm v 指令在命令窗口查看两个的版本号 node高于6 9 3 npm版本高于3 0 0 如果你是新安装的话 就不要考虑这个问题了 2 全局安装 Angular CLI npm install
  • Java线程池的使用(简单实现)

    一 线程池的概念 创建Java线程需要给线程分配堆栈内存以及初始化内存 还需要进行系统调用 频繁地创建和销毁线程会大大降低系统的运行效率 采用线程池来管理线程有以下好处 提升性能 线程池能独立负责线程的创建 维护和分配 线程管理 每个Jav
  • Navicat 连接Oracle时提示oracle library is not loaded的问题解决

    Navicat 连接Oracle时提示oracle library is not loaded的问题解决 笔者使用的Navicat Premium 12启动界面截屏 请注意是64位的 笔者win7 64位系统 连接Oracle时提示 ora
  • Eclipse报错-The selection cannot be launched,and there are no recent launches

    Eclipse报错 报错 The selection cannot be launched and there are no recent launches 怎么解决 解决办法 1 检查分号 2 检查main函数 3 检查main函数后面括
  • 【buildroot】buildroot使用总结

    文章目录 一 buildroot使用步骤 1 构建图形配置界面 2 配置Target options 3 配置Build options 4 配置Toolchain 5 配置 System configuration 6 配置 Filesy
  • 运用顺序表实现多项式相加

    本题要求输入两个一元多项式 然后输出它们的和 相加后得到的一元多项式 输入格式 输入一个整数n 表示输入组数 然后依次输入每一组数据 输入一个整数A 表示多项式的项数 小于100 然后输入A对整数 每一对整数表示对应项的指数和系数 输出格式
  • 通配符

    1 通配符 用来匹配文件名或目录 匹配文件内容用正则表达式 匹配任意一个字符 匹配0个或任意多个字符 也就是可以匹配任何内容 匹配括号中的任意一个字符 eg abc 匹配一个字符 或a 或b 或c 匹配括号中任意一个字符 代表一个范围 eg
  • 词向量的运算与Emoji生成器

    本文参考参考 没有对框架内容进行学习 旨在学习思路和方法 1 词向量运算 之前学习RNN和LSTM的时候 输入的语句都是一个向量 比如恐龙的名字那个例子就是将一个单词中的字母按顺序依次输入 这对于一个单词的预测是可行的 但是对于想让机器学习
  • Qt - MVC模型/视图编程

    MVC模型 视图编程 Qt中的模型 视图架构用来实现大量的数据存储 处理及显示 MVC Model View Controller 包括了3个组件 模型 Model 是应用对象 用来表示数据 视图 View 是模型的用户界面 用来显示数据
  • mac安装eclipse报错:Failed to create the Java Virtual Machine

    目录 1 报错场景 2 解决办法 1 查看本机安装的JAVA环境 2 修改info plsit文件 1 报错场景 macosx安装Eclipse的时候报错 Failed to create the Java Virtual Machine
  • @InitBinder解析和@ModelAttribute参数注入分析

    当我们请求 hello时 传参数u username如何注入到user中的username 样例 Controller public class HelloController RequestMapping hello public Str
  • Activiti7与SpringBoot整合开发

    SpringBoot 整合 Activti7 的具体步骤大概包括以下4步 1 添加 SpringBoot 整合 Activti7 的相关jar包 2 添加 SpringSecurity 安全框架的整合配置信息 3 使用 Activti7 新
  • 用递归解决八皇后问题

    单纯用递归解决该问题 就是利用一个一维数组表示出每种解 例如arry n i 其中n表示第n行的棋子 而 i 表示该 行的棋子所在列的位置 该问题可以用贪心算法进行优化 这是针对初学者练习递归时的一种解决办法 该代码并不是为了优化解决问题
  • flutter 开发踩坑集

    一 TextField设置高度后 文字无法居中 解决方案 TextField style TextStyle decoration InputDecoration prefixIcon ImageUtils getImage search
  • 区块链技术发展现状与展望 论文阅读摘要(袁勇、王飞跃)

    阅读摘要
  • 前端代码审查和测试

    检查代码的概念和过程 来自百度回答 https zhidao baidu com question 499002410583455364 html 1 代码检查法 1 桌面检查 这是一种传统的检查方法 由程序员检查自己编写的程序 程序员在程
  • GPT带我学-设计模式-命令模式

    1 你知道设计模式的命令模式吗 是的 我知道设计模式中的命令模式 命令模式是一种行为型设计模式 它将请求封装成一个对象 从而允许使用不同的请求 队列或日志来参数化其他对象 命令模式还支持撤销操作 并且可以提供事务的实现 在命令模式中 有四个