源代码:https://gitee.com/AgentXiao/BehavioralPatterns
要点:
1、命令模式解决的问题
2、命令模式的实现
3、命令模式的优缺点
一、为什么要使用命令模式?
在一些软件系统中,行为的请求者和行为的执行者通常是一种耦合关系,但是如果需要对行为进行记录、撤销或重做等操作时,这种耦合关系是无法实现的。
使用命令模式,正是为了实现行为请求者和行为执行者之间的解耦,使得行为在执行时可以进行某些操作,在执行后也可以进行某些操作。
二、命令模式的核心
1、Invoker调用者/请求者
请求的发送者,它不需要直接和请求的执行者直接发生关联,而是通过抽象命令类间接的和请求执行者发生关联。
Invoker持有Command类的引用
2、Command抽象命令类
3、ConcreteCommand具体命令类
通过调用接收者间接实现了请求,但是在调用之前和之后都可以进行某些操作完成记录、撤销或重做等操作。
ConcreteCommand持有Receiver的引用
4、Receiver接收者
接收者执行与请求相关的操作,具体实现对请求的业务处理。
5、Client客户端
在客户端创建调用者对象、具体命令类对象,同时指定请求接收者对象,因此请求的发送者和接收者之间没有直接的关联。
三、具体实现
1、Invoker调用者/请求者
/**
* @ClassName Invoker
* @Description 命令调用者
* @Author xwd
* @Date 2018/10/27 22:09
*/
public class Invoker {
private Command command;//持有命令类的引用
public Invoker(Command command) {
this.command = command;
}
/**
* @MethodName toMakeIt
* @Descrition 执行请求
* @Param []
* @return void
*/
public void toMakeIt(){
command.execute();
}
}
2、Command抽象命令类
/**
* @InterfaceName Command
* @Description 抽象命令类
* @Author xwd
* @Date 2018/10/27 22:08
*/
public interface Command {
/**
* @MethodName execute
* @Descrition 命令执行。命令执行之前和之后可做自己想要的操作
* @Param []
* @return void
*/
void execute();
}
3、ConcreteCommand具体命令类
/**
* @ClassName ConcreteCommand
* @Description 具体命令类
* @Author xwd
* @Date 2018/10/27 22:09
*/
public class ConcreteCommand implements Command{
private Receiver receiver;//持有行为执行者的引用
public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
System.out.println("准备转账!");
receiver.change();
System.out.println("转账善后!");
}
}
4、Receiver接收者
/**
* @ClassName Receiver
* @Description 命令执行者
* @Author xwd
* @Date 2018/10/27 22:09
*/
public class Receiver {
/**
* @MethodName change
* @Descrition 具体的请求:转账
* @Param []
* @return void
*/
public void change(){
System.out.println("转账!");
}
}
5、Client客户端
/**
* @ClassName Client
* @Description 客户端
* @Author xwd
* @Date 2018/10/27 22:09
*/
public class Client {
public static void main(String[] args) {
Invoker invoker = new Invoker(new ConcreteCommand(new Receiver()));
invoker.toMakeIt();
}
}
6、输出结果

四、总结
1、优点
降低了系统的耦合度;新的命令可以很容易的添加到系统中
2、缺点
使用命令模式可能会导致某些系统有过多的具体命令类
3、开发中常见的场景:
- Struts2中,action的整个调用过程中就有命令模式。
- 数据库事务机制的底层实现
- 命令的撤销和恢复
网友评论