网站代码 字体,商城网站建设公司价格,wordpress无法打开网页,建站宝盒是什么1、简介
1.1、概述
在软件开发中#xff0c;经常需要向某些对象发送请求#xff08;调用其中的某个或某些方法#xff09;#xff0c;但是并不知道请求的接收者是谁#xff0c;也不知道被请求的操作是哪个。此时#xff0c;特别希望能够以一种松耦合的方式来设计软件经常需要向某些对象发送请求调用其中的某个或某些方法但是并不知道请求的接收者是谁也不知道被请求的操作是哪个。此时特别希望能够以一种松耦合的方式来设计软件使得请求发送者与请求接收者能够消除彼此之间的耦合让对象之间的调用关系更加灵活可以灵活地指定请求接收者以及被请求的操作。命令模式为此类问题提供了一个较为完美的解决方案。
命令模式可以将请求发送者和接收者完全解耦。发送者与接收者之间没有直接引用关系发送请求的对象只需要知道如何发送请求而不必知道如何完成请求。
1.2、定义
将一个请求封装为一个对象从而可用不同的请求对客户进行参数化对请求排队或者记录请求日志以及支持可撤销的操作。命令模式是一种对象行为型模式其别名为动作Action模式或事务Transaction模式。
2、解析
2.1、UML类图
命令模式的核心在于引入了命令类。通过命令类来降低发送者和接收者的耦合度请求发送者只需指定一个命令对象再通过命令对象来调用请求接收者的处理方法其结构如下图所示 可以看出在命令模式结构图中包含以下4个角色
Command抽象命令类抽象命令类一般是一个抽象类或接口在其中声明了用于执行请求的execute等方法通过这些方法可以调用请求接收者的相关操作。ConcreteCommand具体命令类具体命令类是抽象命令类的子类实现了在抽象命令类中声明的方法。它对应具体的接收者对象将接收者对象的动作绑定其中。在实现execute方法时将调用接收者对象的相关操作Action。Invoker调用者调用者即请求发送者它通过命令对象来执行请求。一个调用者并不需要在设计时确定其接收者因此它只与抽象命令类之间存在关联关系。在程序运行时可以将一个具体命令对象注入其中再调用具体命令对象的execute方法从而实现间接调用请求接收者的相关操作。Receiver接收者接收者执行与请求相关的操作它具体实现对请求的业务处理。
2.2、代码示例
命令模式的本质是对请求进行封装。一个请求对应于一个命令将发出命令的责任和执行命令的责任分割开。每个命令都是一个操作请求的一方发出请求要求执行一个操作接收的一方收到请求并执行相应的操作。命令模式允许请求的一方和接收的一方独立开来使得请求的一方不必知道接收请求的一方的接口更不必知道请求如何被接收、操作是否被执行、何时被执行以及是怎么被执行的。
命令模式的关键在于引入了抽象命令类。请求发送者针对抽象命令类编程只有实现了抽象命令类的具体命令才与请求接收者相关联。在最简单的抽象命令类中只包含了一个抽象的execute方法每个具体命令类将一个Receiver类型的对象作为一个实例变量进行存储从而具体指定一个请求的接收者。不同的具体命令类提供了execute方法的不同实现并调用不同接收者的请求处理方法。
典型的抽象命令类代码如下
abstract class Command{public abstract void execute();
}对于请求发送者即调用者而言将针对抽象命令类进行编程可以通过构造注入或者设值注入的方式在运行时传入具体命令类对象并在业务方法中调用命令对象的execute方法。其典型代码如下
class Invoker{private Command command;// 构造注入public Invoker(Command command){this.commondcommond;}// 设值注入public void setCommand(Command command){this.commondcommond;}// 业务方法用于调用命令类的execute()方法public void call(){command.execute();}
}具体命令类继承了抽象命令类它与请求接收者相关联实现了在抽象命令类中声明的execute方法并在实现时调用接收者的请求响应方法action。其典型代码如下
class ConcreteCommand extends Commond{// 维持一个对请求接受者对象的引用private Receiver receivernew Receiver();// 调用请求接受这的业务方法action()public void execute(){receiver.action();}
}请求接收者Receiver类具体实现对请求的业务处理它提供了action方法用于执行与请求相关的操作。其典型代码如下
class Receiver{public void action(){// 具体操作}
}3、宏命令
宏命令Macro Command又称为组合命令它是组合模式和命令模式联用的产物。宏命令是一个具体命令类它拥有一个集合属性在该集合中包含了对其他命令对象的引用。通常宏命令不直接与请求接收者交互而是通过它的成员来调用接收者的方法。当调用宏命令的execute方法时将递归调用它所包含的每个成员命令的execute方法。一个宏命令的成员可以是简单命令还可以继续是宏命令。执行一个宏命令将触发多个具体命令的执行从而实现对命令的批处理。其结构如下图所示
4、命令模式总结
命令模式是一种使用频率非常高的设计模式用于将请求发送者与接收者解耦。请求发送者通过命令对象来间接引用请求接收者使得系统具有更好的灵活性和可扩展性。在基于GUI的软件开发无论是计算机桌面应用还是移动应用中命令模式都得以广泛应用。
4.1、主要优点
降低系统的耦合度。由于请求者与接收者之间不存在直接引用因此请求者与接收者之间实现完全解耦相同的请求者可以对应不同的接收者。同样相同的接收者也可以供不同的请求者使用两者之间具有良好的独立性。新的命令可以很容易地加入系统中。由于增加新的具体命令类不会影响到其他类因此增加新的具体命令类很容易无须修改原有系统源代码甚至客户类代码满足开闭原则的要求。可以比较容易地设计一个命令队列或宏命令组合命令。为请求的撤销Undo和恢复Redo操作提供了一种设计和实现方案。
4.2、主要缺点
使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个对请求接收者的调用操作都需要设计一个具体命令类因此在某些系统中可能需要提供大量的具体命令类这将影响命令模式的使用。
4.3、适用场景
系统需要将请求调用者和请求接收者解耦使得调用者和接收者不直接交互。请求调用者无须知道接收者的存在也无须知道接收者是谁接收者也无须关心何时被调用。系统需要在不同的时间指定请求、将请求排队和执行请求。一个命令对象和请求的初始调用者可以有不同的生命期。换言之最初的请求发出者可能已经不在了而命令对象本身仍然是活动的可以通过该命令对象去调用请求接收者而无须关心请求调用者的存在性可以通过请求日志文件等机制来具体实现。系统需要支持命令的撤销Undo操作和恢复Redo操作。系统需要将一组操作组合在一起形成宏命令。