南宁cms建站系统,什么网站可以学做西餐,wordpress评测,网站建设越来越难做阅读建议
嗨#xff0c;伙计#xff01;刷到这篇文章咱们就是有缘人#xff0c;在阅读这篇文章前我有一些建议#xff1a;
本篇文章大概4000多字#xff0c;阅读时间长可能需要4-5分钟#xff0c;请结合示例耐心读完#xff0c;绝对有收获。设计模式属于程序的设计思… 阅读建议
嗨伙计刷到这篇文章咱们就是有缘人在阅读这篇文章前我有一些建议
本篇文章大概4000多字阅读时间长可能需要4-5分钟请结合示例耐心读完绝对有收获。设计模式属于程序的设计思想、方法类的内容阅读一遍在理解上不一定会很透彻建议收藏起来有空多看看书读百遍其义自现。创作不易免费的点赞、关注请走上一走也算是对博主一些鼓励可以让我更有动力输出更多的干货内容。UML类图是一个好东西要多看如果会画就更好了一图胜千言。
什么是命令模式 命令模式Command Pattern是一种行为型设计模式它将请求和处理分开使得请求发送者和接收者解耦从而降低系统的耦合度。在命令模式中请求被封装为一个独立的对象并且将其参数化以便在不同的请求中传递不同的参数。
命令模式有哪些核心角色 在命令模式中请求被封装为一个对象从而可以将请求的调用者与实现者分离开来。这降低了系统的耦合度使得不同的调用者可以发送不同的请求给同一个接收者而不需要修改接收者的代码。同时命令模式还提供了对事务进行建模的方法可以实现对事务的撤销、重做等操作。其核心角色主要有以下几个核心组成部分 命令接口(Command)定义了执行操作的接口通常包含一个执行方法(execute)。具体命令(ConcreteCommand)实现了命令接口持有对一个接收者对象的引用并将请求转发给接收者执行具体的操作。接收者(Receiver)负责具体执行命令所指定的操作。调用者(Invoker)持有一个命令对象负责调用命令对象执行请求。客户端(Client)创建具体的命令对象并设置命令的接收者。 通过命令模式客户端与调用者之间的耦合可以被解耦客户端只需创建具体的命令对象并将其传递给调用者而不需要了解具体的接收者和操作细节。这样可以实现请求的发送者和接收者之间的解耦并且支持对请求进行排队、记录日志、撤销和重做等操作。
命令模式如何实现
需求描述 理解了命令模式的定义、核心角色以及各核心角色的功能作用如何实现就变得很简单下面以生活中一个事情为例来说明一下如何实现命令模式。在生活中下班回家后坐在沙发上用遥控器打开电视是一个很常见的事情。如果写一段程序来实现用遥控器打开电视这个过程使用命令模式就是一个很好的选择。遥控器本身就是一个命令的接收者而打开电视这个动作实现上就是一个指令。
实现方法 1、声明一个实体电视的遥控器类也就是具体的指令接收者
/*** 遥控器*/
public class RemoteControl {public void onGreenButton(){System.out.println(打开电视);}public void onRedButton(){System.out.println(关闭电视);}public void onButton2_1(){System.out.println(河南卫视);}public void onButton2_2(){System.out.println(北京卫视);}public void onButton2_3(){System.out.println(山东卫视);}public void onDefaultButton(){System.out.println(中央电视台);}
} 2、声明一个抽象指令接口在其中定义一个抽象指令执行内容方法供具体的指令类去实现
/*** 抽象命令接口*/
public interface Command {void execute();
} 3、声明具体按钮指令实现于抽象接口中重写抽象方法的具体实现如打开电视、关闭电视
/*** 打开指令*/
public class OpenCommand implements Command{private RemoteControl remoteControl;public OpenCommand(RemoteControl remoteControl) {this.remoteControl remoteControl;}Overridepublic void execute() {this.remoteControl.onGreenButton();}
}
/*** 关闭指令*/
public class CloseCommand implements Command {private RemoteControl remoteControl;public CloseCommand(RemoteControl remoteControl) {this.remoteControl remoteControl;}Overridepublic void execute() {this.remoteControl.onRedButton();}
} 4、声明一个指令调用者持有一个具体的指令对象即遥控器上具体的按钮指令
/*** 命令执行器*/
public class CommandInvoker {private Command command;public CommandInvoker(Command command) {this.command command;}public void executeCommand(){this.command.execute();}
} 5、编写客户端将具体的遥控器对象、具体的指令整合在一起执行具体的业务操作
public class Client {public static void main(String[] args) {RemoteControl remoteControl new RemoteControl();Command commandnew OpenCommand(remoteControl);CommandInvoker commandInvoker new CommandInvoker(command);commandInvoker.executeCommand();commandnew CloseCommand(remoteControl);commandInvokernew CommandInvoker(command);command.executeCommand();}
} 如何扩展 相信现在大家都了解这样一个事实现在的电视机真是相当的难用广告多的不行各种套娃式的收费但是我观察到一个也比较恶心的现象现在遥控器上面的数字按钮没有了看上去很简洁实际上使用体验并不好。那么如果把这些数字按钮再加上去我想看哪个电视台直接就按哪个岂不妙哉在命令模式的基础上来扩展类似的需求非常简单 1、增加数字按钮指令
/*** 数字指令*/
public class NumberCommand implements Command{private int number;private RemoteControl remoteControl;public NumberCommand(RemoteControl remoteControl) {this.remoteControl remoteControl;}public void setNumber(int number) {this.number number;}Overridepublic void execute() {switch (number){case 21:this.remoteControl.onButton2_1();break;case 22:this.remoteControl.onButton2_2();break;case 23:this.remoteControl.onButton2_3();break;default:this.remoteControl.onDefaultButton();break;}}
} 2、升级一下原来的遥控器的相关业务即可原先的其他指令按钮如打指令按钮、关闭指令按钮等不用变化
public class Client {public static void main(String[] args) {RemoteControl remoteControl new RemoteControl();Command commandnew NumberCommand(remoteControl);CommandInvoker commandInvokernew CommandInvoker(command);commandInvoker.executeCommand();((NumberCommand) command).setNumber(21);commandInvoker.executeCommand();((NumberCommand) command).setNumber(22);commandInvoker.executeCommand();}
}
命令模式适用哪些场景 具有以下特征的业务场景都是比较适合使用命令行模式的如
请求发送者和接收者需要解耦命令模式允许发送者和接收者之间没有直接的关系二者通过命令进行交互。发送者只需要知道发送请求对象不需要知道如何完成请求接收者只需要知道如何完成请求不需要知道请求的发送过程。这种解耦方式可以使系统更加灵活和可维护。需要抽象出待执行的行为命令模式可以将等待执行的行为抽象出来将命令封装成对象以便在程序中灵活地操作。这种抽象方式可以方便地对命令进行记录、撤销、重做等操作。
命令模式的优点和缺点
优点
解耦命令模式解耦了请求发送者和接收者之间的耦合关系使得发送者和接收者只需要通过命令对象进行交互而不需要直接联系。抽象命令模式将请求或操作封装成命令对象从而抽象出待执行的行为提高了系统的可维护性和可扩展性。事务支持命令模式支持事务操作可以将多个命令组合成一个事务从而保证操作的原子性和一致性。撤销支持命令模式可以方便地支持撤销操作通过实现命令的撤销功能可以轻松地回滚操作提高系统的可靠性和可维护性。日志记录命令模式可以实现日志记录功能将命令的操作记录下来以便后续的审计和调试。宏命令命令模式可以支持宏命令将多个命令组合成一个宏命令一次性执行多个操作。
缺点
具体命令类可能过多在命令模式中每个不同的请求或操作都需要一个具体的命令类来封装。因此如果有很多不同的请求或操作就需要定义很多具体的命令类这会增加系统的复杂度和维护成本。实现复杂度较高命令模式需要定义很多类和接口同时需要实现撤销、事务、日志记录等功能因此实现起来比较复杂。设计难度较大命令模式需要设计出合适的命令类和接收者类以及它们之间的交互关系和行为定义等这需要具备较高的设计能力和经验。
总结 命令模式是一种行为型设计模式它允许将请求或操作封装成对象从而解耦了请求发送者和接收者之间的耦合关系具有解耦、抽象、事务支持、撤销支持、日志记录和宏命令等优点但也存在具体命令类过多、实现复杂度高和设计难度大等缺点。在使用命令模式时需要根据具体的应用场景和需求来权衡其优劣。 总之命令模式是一种非常实用的设计模式它可以提高系统的灵活性和可维护性使得代码更加清晰、易于理解和扩展强烈建议在合适的场景中使用它。