type
status
date
slug
summary
tags
category
icon
password
命令模式
命令模式是一种行为设计模式, 它可将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中, 且能实现可撤销操作。
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F87cd7b33-b48f-404a-8322-8403322877a9%2F4895ac7e-6dde-48b3-be94-9ea893e9467f%2FUntitled.png?table=block&id=591bf974-54af-4745-8c6d-4e8d313f08e7&t=591bf974-54af-4745-8c6d-4e8d313f08e7&width=624&cache=v2)
命令模式结构
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F87cd7b33-b48f-404a-8322-8403322877a9%2F4ad4f67e-6ab6-434e-b77d-29d0b92c7102%2FUntitled.png?table=block&id=9c8f4c42-7c9a-4bd8-be09-5fcccb2b200b&t=9c8f4c42-7c9a-4bd8-be09-5fcccb2b200b&width=1993&cache=v2)
- 发送者(Sender)——亦称 “触发者(Invoker)”——类负责对请求进行初始化,其中必须包含一个成员变量来存储对于命令对象的引用。发送者触发命令,而不向接收者直接发送请求。注意,发送者并不负责创建命令对象:它通常会通过构造函数从客户端处获得预先生成的命令。
- 命令(Command)接口通常仅声明一个执行命令的方法。
- 具体命令 (Concrete Commands)会实现各种类型的请求。具体命令自身并不完成工作,而是会将调用委派给一个业务逻辑对象。但为了简化代码,这些类可以进行合并。接收对象执行方法所需的参数可以声明为具体命令的成员变量。你可以将命令对象设为不可变,仅允许通过构造函数对这些成员变量进行初始化。
- 接收者(Receiver)类包含部分业务逻辑。几乎任何对象都可以作为接收者。绝大部分命令只处理如何将请求传递到接收者的细节,接收者自己会完成实际的工作。
- 客户端(Client)会创建并配置具体命令对象。客户端必须将包括接收者实体在内的所有请求参数传递给命令的构造函数。此后,生成的命令就可以与一个或多个发送者相关联了。
命令模式通用代码:
命令模式适用场景
- 如果你需要通过操作来参数化对象,可使用命令模式。
命令模式可将特定的方法调用转化为独立对象。 这一改变也带来了许多有趣的应用: 你可以将命令作为方法的参数进行传递、 将命令保存在其他对象中, 或者在运行时切换已连接的命令等。
- 如果你想要将操作放入队列中、操作的执行或者远程执行操作,可使用命令模式。
同其他对象一样,命令也可以实现序列化(序列化的意思是转化为字符串),从而能方便地写入文件或数据库中。一段时间后,该字符串可被恢复成为最初的命令对象。因此,你可以延迟或计划命令的执行。但其功能远不止如此!使用同样的方式,你还可以将命令放入队列、记录命令或者通过网络发送命令。
- 如果你想要实现操作回滚功能,可使用命令模式。
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F87cd7b33-b48f-404a-8322-8403322877a9%2Fa6659b79-6ccc-4010-b260-3c669e043b6f%2FUntitled.png?table=block&id=7d34e75e-af20-483c-96ef-a6d853162c5d&t=7d34e75e-af20-483c-96ef-a6d853162c5d&width=1668&cache=v2)
识别方法:命令模式可以通过抽象或接口类型(发送者)中的行为方法来识别, 该类型调用另一个不同的抽象或接口类型 (接收者)实现中的方法,该实现则是在创建时由命令模式的实现封装。命令类通常仅限于一些特殊行为。
命令模式优缺点
命令模式优点:
- 单一职责原则。你可以解耦触发和执行操作的类。
- 开闭原则。你可以在不修改已有客户端代码的情况下在程序中创建新的命令。
- 你可以实现撤销和恢复功能。
- 你可以实现操作的延迟执行。
- 你可以将一组简单命令组合成一个复杂命令。
命令模式缺点:
- 代码可能会变得更加复杂,因为你在发送者和接收者之间增加了一个全新的层次。
练手题目
题目描述
小明去奶茶店买奶茶,他可以通过在自助点餐机上来点不同的饮品,请你使用命令模式设计一个程序,模拟这个自助点餐系统的功能。
输入描述
第一行是一个整数 n(1 ≤ n ≤ 100),表示点单的数量。接下来的 n 行,每行包含一个字符串,表示点餐的饮品名称。
输出描述
输出执行完所有点单后的制作情况,每行输出一种饮品的制作情况。如果制作完成,输出 "XXX is ready!",其中 XXX 表示饮品名称。
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F87cd7b33-b48f-404a-8322-8403322877a9%2F9240fa80-db03-4162-927c-7f9c7045d649%2FUntitled.png?table=block&id=f527d07f-5319-493b-a392-89d5b9a6da2a&t=f527d07f-5319-493b-a392-89d5b9a6da2a&width=760&cache=v2)
题解
解法一:
解法二:
解法三:命令模式+工厂模式
欢迎您在底部评论区留言,一起交流~
- 作者:Nolan
- 链接:https://nolanblog.top/article/DP9
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。