【设计模式】-命令模式学习(一)
目录背景我的场景类图设计代码实现运行结果解读1、服务员类2、命令类对服务员手上的“小册子”的抽象记录点餐要求支持用户撤销。3、厨师类具体执行类不同类型的厨师做不同的菜减少厨师切换成本4、 客户端代表用户发来请求用户只说自己需要什么不需要知道烤串、炒菜谁来做。总结1、什么是命令模式2、梳理需求——确定类——画类图——根据类图写代码。3、代码如人生遗留问题命令模式(Command),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作[DP]。背景最近在学习设计模式-命令模式参考 《大话设计模式》里面讲到了小菜和大鸟吃烧烤的故事他们先去了烧烤摊烧烤摊接待客户和烤串者都是同一个人问题频出烤错了、烤少、结错账……于是他们转战到烧烤店烧烤店服务员接待他们用“小册子”记录他们点餐错了还能划掉最后顺利吃烤串账单正确。原文如下我心想我也爱吃烧烤把我自己吃烧烤的经验用命令模式实现一遍让我的生活融入代码吧说干就干我的场景来到某烧烤店我“服务员来两串牛肉串两串羊肉串一个炒方便面... ...”。服务员在“小册子”上写下”牛肉串✖️2羊肉串✖️2炒方便面 ✖️1 ... ...”。服务员去后厨给炒菜师傅炒菜菜单通知烤串师傅烤串菜单。类图设计代码实现import java.util.ArrayList; import java.util.List; public class Waiter { // 维护命令列表,聚合关系 private ListCommand commands new ArrayList(); // 添加命令 // 服务员根据 name 和 number 创建 command根据 name区分烤串还是炒菜根据 number区分是几道菜创建 command public void addCommand(String name,int number) { if(name.contains(烤)){ commands.add(new BakeCommand(name,number,new BakeCook())); }else { commands.add(new FryCommand(name,number,new FryCook())); } } public void notifyExecute() { System.out.println(开始通知后厨); for (Command command : commands) { command.execute(); }public abstract class Command { private String name; // 菜名 private int number; // 数量 private Cook cook; // 厨师 // 构造方法 - Command 聚合 Cook // 创建 command 的时候服务员把厨师聚合进来服务员知道什么类型的菜交给什么厨师做 public Command(String name, int number, Cook cook){ this.name name; this.number number; this.cook cook; } public String getName() { return name; } public int getNumber() { return number; } public void execute(){ cook.bake(this); } }public class BakeCommand extends Command{ public BakeCommand(String name, int number, Cook cook){ super(name, number, cook); } }public class FryCommand extends Command { public FryCommand(String name, int number, Cook cook) { super(name, number, cook); } }public interface Cook { public void bake(Command command); }public class BakeCook implements Cook{ Override public void bake(Command command) { System.out.println([烧烤厨房] command.getNumber() 个 command.getName() 开始烤啦!); } }public class FryCook implements Cook{ Override public void bake(Command command) { System.out.println([炒菜厨房] command.getNumber() 个 command.getName() 开始做啦!); } }public class Client { public static void main(String[] args) { // 来了一个顾客开始下单 System.out.println(顾客开始下单); Waiter waiter new Waiter(); waiter.addCommand(烤羊肉串,2); waiter.addCommand(烤牛肉串,2); waiter.addCommand(烤油边,2); waiter.addCommand(炒方便面,1); waiter.addCommand(田园大拌菜,1); waiter.notifyExecute(); } }运行结果顾客开始下单 开始通知后厨 [烧烤厨房]2个烤羊肉串 开始烤啦! [烧烤厨房]2个烤牛肉串 开始烤啦! [烧烤厨房]2个烤油边 开始烤啦! [炒菜厨房]1个炒方便面 开始做啦! [炒菜厨房]1个田园大拌菜 开始做啦!解读1、服务员类1维护命令列表private List commands new ArrayList();2接受订单3维护“映射”, 按菜品名查表创建 Command 知道烤串和炒菜分别让哪个师傅做因此服务员持有对 BakeCook 和 FryCook的引用4撤销订单5将客户与厨师解耦6通知厨师制作2、命令类对服务员手上的“小册子”的抽象记录点餐要求支持用户撤销。用多态区分不同命令类型。3、厨师类具体执行类不同类型的厨师做不同的菜减少厨师切换成本1做饭4、 客户端代表用户发来请求用户只说自己需要什么不需要知道烤串、炒菜谁来做。总结1、什么是命令模式自己写完实现后内心产生了疑惑到底什么是命令模式关键代码是什么某天听米老师讲完面向对象后我懂了命令模式就是将请求封装成对象去处理。我兴高采烈的向米老师求证老师肯定了我的答案并抛出了另一个问题为什么这样做只知道结论不行我再次陷入沉思。2、梳理需求——确定类——画类图——根据类图写代码。早在 10 年前米老师就教我正确的开发顺序直到这次才算清清楚楚实现认真思考了每个类的生命周期。3、代码如人生为什么我决定自己实现一遍命令模式呢因为第一遍看完书我觉得书上写的不对。客户端怎么能知道哪个厨师去执行命令呢我去吃烧烤从不关注哪个厨师做饭应该是服务员关注啊。于是在我设计的类图中client 只知道 waiter其他什么都不知道由waiter 依赖 cook解决哪个菜由谁做的问题。但我想能写出这么好的书的作者这么写一定有他的道理道理是什么呢终于实现完自己的设计后我想明白了我可以知道哪个厨师在做饭或者说我可以指定厨师。比如一个烧烤店老板和厨师都是同一个人那我就知道是谁做饭了或者说小王师傅的腌笃鲜一绝目前在某五星大饭店任职你去饭店说我要吃小王师傅做的腌笃鲜。对应到代码是什么呢就是调用方指定某个类去执行对应的业务。遗留问题1、waiter还是单一职责的服务员吗2、服务员把“烤”写错了烤串还能吃上吗我们留在下一篇博客中分析。

相关新闻

基于Matlab的配电网MPS动态调度算法实现

基于Matlab的配电网MPS动态调度算法实现

1. 项目背景与核心价值去年参与某沿海城市电网抗台风项目时,我深刻体会到应急电源调度对配电网韧性的决定性作用。当台风导致主干线路瘫痪,预先部署的移动电源车(MPS)在3小时内恢复了80%的关键负荷,这促使我开始系统性…

2026/8/9 4:44:08 阅读更多 →
JMeter内存溢出深度解析:从JVM调优到分布式压测的完整解决方案

JMeter内存溢出深度解析:从JVM调优到分布式压测的完整解决方案

1. 项目概述:JMeter内存溢出,性能测试工程师的“头号公敌”如果你正在用JMeter做性能测试,尤其是模拟高并发或者长时间运行的压测场景,那么屏幕前突然弹出的那个“java.lang.OutOfMemoryError: Java heap space”错误,…

2026/8/9 4:43:08 阅读更多 →
走进中铁建设集团门户网站:一个大型央企的数字化转型与温暖守护

走进中铁建设集团门户网站:一个大型央企的数字化转型与温暖守护

如果你曾经有机会走近一些大型的国家级工程项目现场,你或许会被那种宏大的场面深深震撼。高耸入云的塔吊,蜿蜒如长龙的桥梁,还有那些在烈日暴雨下依然坚守岗位的工人们。这不仅仅是一个个建筑体量的堆叠,更是一个个关于梦想、责任和时间的故事。而在这些故事背后,有一个看…

2026/8/9 4:43:08 阅读更多 →

最新新闻

Bamtone班通:离子污染测试仪选型指南

Bamtone班通:离子污染测试仪选型指南

离子污染测试仪是确保产品质量和可靠性的关键设备,如何选择一款高性能、符合离子污染度检测标准且易于操作的离子污染测试仪?且听小编为你逐一解析。在选购离子污染测试仪时,应重点关注这几个要素:性能指标:包括测量精…

2026/8/9 11:43:24 阅读更多 →
刚性常微分方程组求解:原理、算法与工程实践

刚性常微分方程组求解:原理、算法与工程实践

1. 刚性常微分方程组求解概述 在工程计算和科学仿真领域,我们经常会遇到这样一类微分方程:它们看似简单,但用常规方法求解时要么计算量爆炸,要么结果完全失真。这类方程就是所谓的"刚性(stiff)方程"。我第一次遇到刚性问…

2026/8/9 11:43:24 阅读更多 →
5步诊断ChatBox连接Ollama的404错误:从新手到专家的完整指南

5步诊断ChatBox连接Ollama的404错误:从新手到专家的完整指南

5步诊断ChatBox连接Ollama的404错误:从新手到专家的完整指南 【免费下载链接】chatbox Powerful AI Client 项目地址: https://gitcode.com/GitHub_Trending/ch/chatbox 当我们在ChatBox中配置Ollama本地模型时,却遭遇了令人沮丧的404错误&#x…

2026/8/9 11:43:24 阅读更多 →
K8s‑APIScheduler/kubelet 核心组件完整工作流程

K8s‑APIScheduler/kubelet 核心组件完整工作流程

开篇痛点 不少后端、运维人员日常只会简单操作 kubectl,并不清楚 Pod 从提交到正常运行整套链路。碰到调度失败、Pod 迟迟起不来、kubelet 报错、节点无法接纳负载等线上故障时无从下手。 本节完整拆解 kube‑apiserver、kube‑scheduler、kubelet 三大核心组件交互流程,理清…

2026/8/9 11:43:24 阅读更多 →
AI舞蹈视频生成技术实践:从部署到调优的完整指南

AI舞蹈视频生成技术实践:从部署到调优的完整指南

在实际 AI 生成内容领域,从静态图像到动态视频的跨越是技术演进的必然趋势,而舞蹈视频生成因其对动作连贯性、节奏感和艺术表现力的高要求,一直是技术探索的前沿。Dreamina Seedance 2.5 作为一款专注于舞蹈视频生成的 AI 工具,其…

2026/8/9 11:43:24 阅读更多 →
ComfyUI-Impact-Pack终极指南:5大核心功能解锁AI图像增强专业级应用

ComfyUI-Impact-Pack终极指南:5大核心功能解锁AI图像增强专业级应用

ComfyUI-Impact-Pack终极指南:5大核心功能解锁AI图像增强专业级应用 【免费下载链接】ComfyUI-Impact-Pack Custom nodes pack for ComfyUI This custom node helps to conveniently enhance images through Detector, Detailer, Upscaler, Pipe, and more. 项目地…

2026/8/9 11:42:24 阅读更多 →

日新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/9 0:01:47 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/9 0:01:47 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/9 0:03:48 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/9 0:01:47 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/9 0:01:47 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/9 0:03:48 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/8 17:02:44 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/9 0:45:04 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/8 17:02:44 阅读更多 →