命令模式
介绍:将一个请求封装为一个对象,从而是我们使我们可用不同的请求对客户进行参数化,对请求排队或者记录日志,以及支持可撤销的操作,也称为action模式
角色:
Command:抽象命令类
concreteCommand:具体命令类
Invoke:调用者/请求者
请求的发送者,它通过命令对象来执行请求,一个调用者并不需要设计的时候确定其接受者,因此它只和抽象命令接口之间存在关系,在程序运行的时候调用命令对象的execute方法,间接调用接受者的相关操作
receiver:
接受者执行与请求相关的操作,具体实现对业务的处理
可以是不同的接受者,或者定义抽象类
client客户端:
在客户类中需要创建调用者对象,具体的命令对象,在创建具体命令对象时指定接受者,发送者和接受者之间没有直接的关系,都是通过命令对象间接调用
类图:
代码:
public interface Command { /** * 实际项目中,我们可以根据需求可以设计多个不同的方法 */ void execute(); } public class ConcreteCommandImpl implements Command { private Receiver receiver; public ConcreteCommandImpl(Receiver receiver) { this.receiver = receiver; } @Override public void execute() { System.out.println("具体调用.我先看看情况"); receiver.action(); } } /** * 真正命令的执行者 */ public class Receiver { public void action(){ System.out.println("Receiver.action(),,,,,,,,,"); } } /** * 命令的调用者,和发起者 */ public class Invoke { /** * 这里可以是一条,也可以是多条 可以是map 可以是list * 数据底层事物就是这样的 */ private Command command; public Invoke(Command command) { this.command = command; } /** * 调用者,可以做些业务的方法. */ public void call(){ command.execute(); } } public class Main { public static void main(String[] args) { Command concreteCommand = new ConcreteCommandImpl(new Receiver()); Invoke invoke = new Invoke(concreteCommand); invoke.call(); } }
总结:
这个模式在项目中很少使用,不过我们还是对它了解一下比较好,在数据的底层事物实现的时候,就是这样的模式
我对命令模式的理解,就是invoker和receiver 解耦, invoke也可以调用很多命令组成一个庞大的运行逻辑
感觉它和中介者模式有点类似,不过命令模式可以组成把很多命令组合起来使用.