前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的命令模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
🏠个人主页:小威要向诸佬学习呀
🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
目前状况🎉:24届毕业生,在一家满意的公司实习👏👏💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘
以下正文开始
文章目录
- 命令模式概念
- 命令模式角色
- 命令模式注意事项
- 命令模式案例
- 命令模式小结
命令模式概念
命令模式(Command Pattern)是一种行为型设计模式,它将请求或操作封装成一个对象,从而使不同的请求可以被异步、延迟、排队,或者记录下来以备撤销或重做等操作。命令模式可以将客户端和接收者解耦,提高系统的灵活性与可扩展性。
命令模式角色
命令模式包含如下几个主要角色:
命令(Command):定义了执行操作的接口,包含了执行该命令所需的所有必要信息。
具体命令(Concrete Command):实现了命令接口,它包含了一个接收者对象,并完成具体的命令操作。
接收者(Receiver):执行命令的对象,真正的命令执行者。
调用者(Invoker):发出命令并要求执行命令的对象,通常会持有命令对象,并通过命令对象来执行具体的操作。
客户端(Client):创建具体的命令对象,并将其设置到调用者中,然后发起调用者的请求。
命令模式注意事项
在使用命令模式时,需要注意以下几点:
尽量将每个命令实现为一个独立的类,这样可以方便地扩展新的命令类型。
命令对象可以被序列化,并且命令队列支持保存和恢复操作,从而可以实现日志记录、撤销和重做等功能。
可以使用组合模式将命令组合成宏命令,从而可以批量执行多个命令。
在有些场景下,可以使用命令模式来代替回调函数(callback),从而避免回调函数带来的复杂度和耦合性。
命令模式案例
接下来通过一个案例来学习命令模式,此案例展示了如何使用命令模式将请求封装成对象,并实现撤销操作:
// 定义命令接口
interface Command {void execute();void undo();
}// 实现具体命令对象
class LightOnCommand implements Command {private final Light light;private boolean lastState;public LightOnCommand(Light light) {this.light = light;}@Overridepublic void execute() {lastState = light.isOn();light.turnOn();}@Overridepublic void undo() {if (lastState) {light.turnOn();} else {light.turnOff();}}
}// 实现接收者对象
class Light {private boolean isOn = false;public boolean isOn() {return isOn;}public void turnOn() {isOn = true;System.out.println("Light is on");}public void turnOff() {isOn = false;System.out.println("Light is off");}
}// 实现调用者对象
class RemoteControl {private final Command command;public RemoteControl(Command command) {this.command = command;}public void pressButton() {command.execute();}public void pressUndo() {command.undo();}
}// 客户端代码
public class Client {public static void main(String[] args) {// 创建接收者对象Light light = new Light();// 创建具体命令对象LightOnCommand onCommand = new LightOnCommand(light);// 创建调用者对象,并设置命令对象RemoteControl remoteControl = new RemoteControl(onCommand);// 发起请求remoteControl.pressButton();// 撤销请求remoteControl.pressUndo();}
}
在上面的示例代码中,我们使用命令模式将打开电灯的操作封装成了一个命令对象 LightOnCommand,并通过调用者对象 RemoteControl 来发起请求。客户端可以根据需要创建不同的命令对象,并将其设置到调用者对象中,然后通过调用调用者对象的方法来执行具体的命令操作。
命令模式还支持命令队列、宏命令和日志记录等高级特性,可以根据具体的场景选择适合的方式来使用命令模式。
命令模式小结
命令模式(Command Pattern)是一种优秀的行为型设计模式,它将一个请求封装成一个对象,从而使得请求发起者与请求接收者解耦,并可支持撤销、重做等功能。通过使用命令模式,可以极大地提高代码复用性、灵活性和可扩展性。
好了,本篇文章就先分享到这里了,后续将会继续介绍23种设计模式之其他模式,感谢大佬认真读完支持咯~
文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
希望能和诸佬们一起努力,今后我们顶峰相见🍻
再次感谢各位小伙伴儿们的支持🤞