百科知识

创造模式下获取命令方块(设计版)-命令之秘

创造模式下获取命令方块(设计版)-命令之秘

大家好,我是易元。这是我在学习设计模式的过程中所记录的一些笔记和心得体会。如果有任何不准确的地方,欢迎大家指正。

一、命令模式的简介

命令模式是一种行为设计模式,通过将请求封装成对象,我们可以使用不同的请求、队列或日志来间接调用其他对象。想象订外卖的流程:用户(触发者)在APP上点击下单(命令),餐厅收到命令后开始制作(接收者)。平台无需关注具体是谁在做饭,只需负责传递命令即可。

二、命令模式的构成

命令模式主要由以下几个部分组成:

1. 命令(Command):定义执行操作的统一接口,将请求封装为独立对象,使得调用者与实现者解耦。

2. 接收者(Receiver):实现具体的业务逻辑,只关注领域内的实现细节,不感知调用流程。

3. 具体命令(ConcreteCommand):持有接收者的引用,通过委托执行接收者的业务方法,并可以存储请求相关的上下文参数。

4. 触发者(Invoker):负责命令的执行,支持命令的存储和调度(如实现命令队列或历史记录),仅依赖命令接口。

5. 客户端(Client):负责创建接收者实例,构造具体命令并绑定接收者,配置触发器与命令的关联关系。

三、实践案例

以居家控制系统为例,我们实现对灯光、空调等设备的远程控制。首先展示不使用命令模式的实现方式,然后分析其不足之处。

基础类(接收者)包括:电灯类、空调类。

在不使用命令模式的情况下,我们可能会在HomeController类中直接对灯光和空调进行操作。当需要新增设备时,需要修改switch-case结构,导致代码难以维护。

而在使用命令模式的实现中:

1. 我们先定义一个抽象的命令类,包括execute和undo方法。

2. 针对每种设备创建一个具体的命令实现类。

3. 控制器(触发者)负责管理命令对象,包括命令的存储、执行和撤销。

4. 客户端负责配置命令与设备的关联关系。

四、如何扩展系统?以窗帘为例

要扩展系统,比如添加窗帘控制功能,我们可以:

1. 新增窗帘类(接收者)。

2. 新增窗帘命令类(具体命令)。

3. 在控制器中使用新的命令类,无需修改控制器代码。

通过命令模式,我们可以轻松地为系统添加新设备,而无需修改核心代码。该模式还使得撤销/重做操作、事务操作、操作历史记录和任务调度变得更加简单。

命令模式的核心思想是将操作抽象为独立对象,通过参数化方式传递请求,从而解耦调用者与实现者。它适用于以下场景:需要解耦请求发送者与执行者、需要支持撤销/重做操作、需要实现事务操作(组合命令)、需要记录操作历史、需要支持任务队列或线程池调度。实现步骤包括定义Command接口、创建具体命令类、创建Invoker类以及客户端的初始化。典型应用包括智能家居控制系统、文本编辑器的撤销/重做功能、事务型数据库操作和任务调度系统等。


创造模式下获取命令方块(设计版)-命令之秘

你可能也会喜欢...