设计模式-命令模式

背景

有一套智能家电,来自不同的厂商,现在需要用一个app控制所有的家电。

每个智能家电对外提供一个接口,来控制这个家电。

基本介绍

我们经常需要向某些对象发送请求,但并不知道具体的接收者是谁。我们在程序运行时指定具体的请求接收者即可,这就是命令模式。

我们会将一个请求封装成一个对象,并要求这个请求是可取消的。

四个角色

①Invoker:调用者(发布命令的人)

②Receiver:接收者(接收命令的人)

③Command:命令接口/抽象类,存放所有命令请求

④ConcreteCommand:命令类,实现命令接口的具体类。调用Receiver实现Command中的命令请求。

具体实现

创建Command接口,声明execute()(执行)方法和Undo()(撤销)方法。

创建具体命令类如:LightOnCommand,LightOffCommand实现Command接口。一般会再创建一个空命令类,可以简化对命令的判空。

创建接收者类:如LightReceiver类。这个类将会被聚合到相应地具体命令类中,

创建调用者类(遥控器类)RemoteController,利用数组存放所有的具体命令类。

具体命令类(以LightOnCommand为例):

声明一个LightReceiver类对象作为成员变量。利用这个成员变量内提供的开灯方法,完成实现接口内的execute方法。利用关灯方法完成实现Undo()方法。

空命令类:用空方法实现接口。可以让每个按钮在初始时,都时空命令。(用空命令来初始化)

遥控器:

声明所有"开"命令的具体命令类数组、所有"关"命令的具体命令类数组,"撤销"命令的具体命类(上一个操作)。

初始化所有命令类(都赋成空命令)

对外提供设计按钮方法(把具体的命令类赋给对应数组内的命令类)。传入"设备",该设备的"开"命令,该设备的"关"命令。

对外提供操作方法,传入"设备","是开还是关",方法内把操作存入"撤销"命令类并执行对应操作。

可以再对外提供撤销命令方法,执行"撤销"命令类的Undo()方法。

调用时,

声明一个Receiver对象(如LightReceive()),

声明相关ConcreteCommand类(如LightOnCommand,LightOffCommand),

把Receiver对象传入ConcreCommand类中,完成对ConcreteCommand类的初始化。

声明一个遥控器类,调用设计按钮方法,设计灯的开关方法(传入灯的指示方法(index/string/enum),传入LightOnCommand,LightOffCommand)。

最后就可以通过遥控器类,执行开关灯的指令。

(有点类似状态机的设计方法)

相关推荐
nnsix12 小时前
设计模式 - 建造者模式 笔记
笔记·设计模式·建造者模式
cui178756812 小时前
矩阵拼团 + 复购拼团:新零售最稳的复购模式,规则简单
大数据·人工智能·设计模式·零售
百珏13 小时前
[灰度发布]:全链路透传组件:APM、自研方案与 Java Agent 的实现取舍
后端·设计模式·架构
likerhood15 小时前
设计模式 · 享元模式(Flyweight Pattern)java
java·设计模式·享元模式
AI大法师15 小时前
从 Adobe 焕新看品牌系统升级:Logo、主色、字体与产品体验如何重新对齐
大数据·人工智能·adobe·设计模式
贵慜_Derek16 小时前
《从零实现 Agent 系统》连载 03|控制循环:感知—决策—行动—反思
人工智能·设计模式·架构
nnsix16 小时前
设计模式 - 原型模式 笔记
笔记·设计模式·原型模式
nnsix17 小时前
设计模式 - 适配器模式 笔记
笔记·设计模式·适配器模式
asdfg125896317 小时前
一文理解软件开发中的“设计模式”
java·设计模式·软件开发
云飞云共享云桌面18 小时前
SolidWorks 服务器通过云飞云共享云桌面10人研发共享方案
运维·服务器·3d·设计模式·电脑