命令模式
请求发送者和请求接受者实现解耦,在命令模式中,会将一个请求封装成一个对象,以便使用不同的参数来表示不同的请求,同时命令模式也支持撤销的操作
命令模式的结构
顾名思义,命令模式就是对命令的封装,首先看下命令模式类图中的基本结构:
command类:是一个抽象类,抽象类在代码中好处在于增加了灵活性
所谓对命令的封装,说白了,无非就是把一系列的操作写到一个方法中,然后供客户端调用就行了
代码
package command;
public class Client {
public static void main(String[] args){
Receiver receiver = new Receiver();
/*接受者的目的在于命令者给指令后接受者做很多事,所有需要他*/
Command command = new ConcreteCommand(receiver);
/*具体的命令传参数为什么是接受者,因为接受者是中间缓冲层,必须放在中间
* 当然自己也可以反过来,但这里不需要*/
//客户端直接执行具体命令方式(此方式与类图相符)
command.execute();
//客户端通过调用者来执行命令
Invoker invoker = new Invoker();
invoker.setCommand(command);
invoker.action();
/*把命令的调用者和执行者分开,使得双方不必关心对方是如何操作的,
* 或者说吧一个命令的执行分为三步
* 执行的流程为调用者类,命令类,接受者类*/
}
}
package command;
/*调用者,负责调用命令*/
/*抽象类*/
abstract class Command {
/*对需要执行的命令进行申明*/
public abstract void execute();
}
/*具体实现类,实现抽象类中方法*/
class ConcreteCommand extends Command {
/*接受者放在这里。接受者接收到的具体需求*/
private Receiver receiver;
public ConcreteCommand(Receiver receiver){
this.receiver = receiver;
}
public void execute() {
this.receiver.doSomething();
}
}
/*接收者,负责接收命令并且执行命令*/
class Receiver {
public void doSomething(){
System.out.println("做一些其他的事");
System.out.println("接受者-业务逻辑处理");
}
}
class Invoker {
/*所有里面要聚合command接口,设置哪个command,以及用到command中的方法
* 这里负责调用命令的意思是写上自己的方法,实则调用command的方法,实现参数可变
* 可以用各种command,这里参数写接口很多好处,写了接口,具体传可以是实现类
* 这是一种多态的表现。更加灵活*/
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void action(){
this.command.execute();
}
}
/*将一个请求封装成一个对象,从而让你使用不同的请求吧客户端参数化,对请求排队或者
* 记录请求日志,可以提供命令的撤销和恢复*/
合理选择命令模式
优点:封装性好,扩展性好
缺点:如果命令很多,开发起来就会很头疼
总结
基于敏捷开发而言,不确定必须用命令模式,我们只需要把请求的响应操作封装到一个方法中,这个封装的方法可以成为命令,但是不是命令模式,到底要不要上升到模式的高度就要另行考虑。

京公网安备 11010502036488号