命令模式
请求发送者和请求接受者实现解耦,在命令模式中,会将一个请求封装成一个对象,以便使用不同的参数来表示不同的请求,同时命令模式也支持撤销的操作
命令模式的结构
顾名思义,命令模式就是对命令的封装,首先看下命令模式类图中的基本结构:
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(); } } /*将一个请求封装成一个对象,从而让你使用不同的请求吧客户端参数化,对请求排队或者 * 记录请求日志,可以提供命令的撤销和恢复*/
合理选择命令模式
优点:封装性好,扩展性好
缺点:如果命令很多,开发起来就会很头疼
总结
基于敏捷开发而言,不确定必须用命令模式,我们只需要把请求的响应操作封装到一个方法中,这个封装的方法可以成为命令,但是不是命令模式,到底要不要上升到模式的高度就要另行考虑。