重庆网站seo多少钱,互联网营销案例,网站建设对服务器有舍要求吗,360报危险网站概念#xff1a;
命令模式是一种行为设计模式#xff0c;它将请求封装成一个对象#xff0c;从而允许您将不同的请求参数化、队列化#xff0c;并且能够在不同的时间点执行。通过引入命令对象#xff08;Command#xff09;来解耦发送者#xff08;Invoker#xff09;…概念
命令模式是一种行为设计模式它将请求封装成一个对象从而允许您将不同的请求参数化、队列化并且能够在不同的时间点执行。通过引入命令对象Command来解耦发送者Invoker和接收者Receiver使得发送者无需知道具体的接收者或操作细节。命令对象封装了一系列操作并提供了一个统一的方法如execute()以便调用这些操作。
特点
解耦性命令模式将发送者与接收者之间解耦使得它们可以独立演化。可扩展性可以方便地添加新的命令类和接收类而无需修改现有代码。可撤销/重做由于每个命令都包含了执行和撤销操作因此可以轻松地实现撤销、重做等功能。容易组合多个简单命令可以组合成复杂命令在需要时进行灵活组合。
优点
降低系统的耦合度。发送者与接收者之间不存在直接关联关系。更好地支持撤销、重做等功能。每个具体命令断言了相关操作及其撤销操作。更好地支持日志和事务。可以记录命令的执行过程以及在需要时进行回滚。
缺点
可能会导致类爆炸。每个具体命令都需要一个对应的接收者类。命令模式增加了系统的复杂性因为它引入了额外的抽象层次。
适用场景
需要将请求参数化、队列滑并希望能够在不同时间执行。需要支持撤销、重做等功能。需要实现日志记录、事务管理等功能。
实现方式
定义一个抽象命令Command接口或抽象类其中包含一个execute()方法用于执行命令。创建具体命令类实现抽象命令接口或继承抽象命令类并在其中编写具体操作逻辑及其撤销逻辑。定义接收者Receiver类该类包含真正执行操作的方法。创建调用者Invoker对象在其中维护一系列命令对象并通过调用execute()方法来触发相应的操作。
实现代码
import java.util.ArrayList;
import java.util.List;// 抽象命令接口
interface Command {void execute();
}// 具体命令类1
class ConcreteCommand1 implements Command {private Receiver receiver;public ConcreteCommand1(Receiver receiver) {this.receiver receiver;}Overridepublic void execute() {receiver.action1();}
}// 具体命令类2
class ConcreteCommand2 implements Command {private Receiver receiver;public ConcreteCommand2(Receiver receiver) {this.receiver receiver;}Overridepublic void execute() {receiver.action2();}
}// 接收者类
class Receiver {public void action1() {System.out.println(执行操作1);}public void action2() {System.out.println(执行操作2);}
}// 调用者类/发送者类/Invoker类
class Invoker {private ListCommand commands new ArrayList();// 添加命令到队列中public void addCommand(Command command) {commands.add(command);}// 执行所有的命令public void executeCommands() {for (Command command : commands) {command.execute();}commands.clear(); // 清空已执行的命令列表可选操作。}
}public class Main {public static void main(String[] args) {// 创建接收者对象Receiver receiver new Receiver();// 创建具体命令对象并指定接收者Command command1 new ConcreteCommand1(receiver);Command command2 new ConcreteCommand2(receiver);// 创建调用者对象并添加命令到队列中Invoker invoker new Invoker();invoker.addCommand(command1);invoker.addCommand(command2);// 执行所有命令invoker.executeCommands();}}在上述代码中我们定义了一个抽象的Command接口其中包含了一个execute()方法。然后创建了两个具体的命令类ConcreteCommand1和ConcreteCommand2它们实现了Command接口并重写了execute()方法。这些具体的命令类将调用接收者类中的不同操作。
在接收者类中我们定义了两个操作action1()和action2()。
最后我们创建了一个调用者类/发送者类/Invoker类。它维护一个命令队列并提供添加命令和执行所有命令的方法。当调用执行所有命令的方法时它会依次执行每个命令。
通过使用命令模式可以将请求发送方与接收方解耦并且可以轻松地添加新的具体命令而无需修改现有代码。此外由于每个具体的命令都是独立封装的对象因此可以轻松地进行参数化配置和传递。