目录
- 定义
- 模式结构
- 角色职责
- 代码实现
- 适用场景
- 优缺点
定义
命令模式(Command Pattern) 又叫动作模式或事务模式。指的是将一个请求封装成一个对象,使发出请求的责任和执行请求的责任分割开,然后可以使用不同的请求把客户端参数化,这样可以使得两者之间通过命令对象进行沟通,从而方便将命令对象进行储存、传递、调用、增加与管理。命令模式是一种对象行为型模式。
模式结构
角色职责
1、抽象命令类(Command): 命令的抽象类,类中对需要执行的命令进行声明,一般来说要对外公布一个execute方法用来执行命令。
2、具体命令类(Concrete Command): 抽象命令类的具体实现子类,对抽象类中声明的方法进行实现。
3、调用类(Invoker): 调用者,负责调用命令,执行命令功能的相关操作,是具体命令对象业务的真正实现者。
4、接受类(Receiver): 接收者,负责接收命令并且执行命令,是请求的发送者,它通常拥有很多的命令对象,并通过访问命令对象来执行相关请求,它不直接访问接收者。
代码实现
抽象命令类:
interface Command {
public abstract void execute();
}
具体命令类:
public class ConcreteCommand implements Command {
private Receiver receive;
public ConcreteCommand() {
receive = new Receiver();
}
@Override
public void execute() {
receive.action();
}
}
调用类:
public class Invoker {
private Command command;
public Invoker(Command command) {
this.command = command;
}
public void setCommand(Command command) {
this.command = command;
}
public void call(){
System.out.println("调用者执行命令command...");
command.execute();
}
}
接受类:
public class Receiver {
public void action() {
System.out.println("接收者的action()方法被调用...");
}
}
测试方法:
public class CommandPattern {
public static void main(String[] args) {
Command command = new ConcreteCommand();
Invoker invoker = new Invoker(command);
System.out.println("客户访问调用者的call()方法");
invoker.call();
}
}
打印结果:
客户访问调用者的call()方法
调用者执行命令command...
接收者的action()方法被调用...
适用场景
优缺点
优点:
1.低耦合: 命令模式使得发起命令的对象——客户端,和具体实现命令的对象——接收者对象完全解耦,也就是说发起命令的对象完全不知道具体实现对象是谁,也不知道如何实现。
2.动态控制:命令模式把请求封装起来,可以动态地对它进行参数化、队列化和日志化等操作,从而使得系统更灵活。
很自然的复合命令:命令模式中的命令对象能够很容易地组合成复合命令,如宏命令,从而使系统操作更简单,功能更强大。
3.易扩展性: 由于发起命令的对象和具体的实现完全解耦,因此扩展新的命令就很容易,只需要实现新的命令对象,然后在装配的时候,把具体的实现对象设置到命令对象中,然后就可以使用这个命令对象,已有的实现完全不用变化。
缺点:
1.一般如果拓展性好的同时会带来显著的缺点就是复杂,代码多,会有大量具体的命令类。命令模式同样的,如果命令很多的话,代码量就比较多。使用命令模式,不用管命令多简单,都需要写一个命令类来封装。