命令模式是一种行为型设计模式,用于将请求封装为一个对象,从而允许客户端通过参数化来进行参数化调用。在命令模式中,请求的发送者(调用者)和请求的接收者(执行者)之间解耦,使得可以灵活地扩展、撤销和队列请求。
以下是命令模式的主要角色:
-
命令(Command): 定义了执行操作的接口,通常包含执行(execute)方法。该接口可以是抽象类或接口,其中可能包含一些参数用于执行请求。
-
具体命令(Concrete Command): 实现了命令接口,负责实现具体的操作。具体命令将接收者对象绑定到一个动作,并在调用时调用接收者的相应方法来执行命令。
-
接收者(Receiver): 接收者知道如何实施与执行一个请求相关的操作。任何类都可以充当一个接收者,只要它能够实现命令要求实现的相应功能。
-
调用者(Invoker): 调用者负责将命令发送给接收者执行。调用者并不知道命令的具体实现,它只知道如何调用命令对象来完成请求。
-
客户端(Client): 这个客户端是命令模式中的客户端。负责创建具体命令对象,并将其绑定到调用者上,以便触发相关操作,更为恰当的称作装配者更合适,组装接受者和命令对象。
命令模式的优点包括:
- 解耦了调用操作的对象和实际执行操作的对象,降低了系统的耦合度。
- 可以轻易地在命令对象上实现撤销、重做、日志记录等功能。
- 可以将命令对象进行参数化,使得可以更加灵活地调用不同的请求。
命令模式通常应用于需要将请求发送给其他对象进行处理的场景,例如菜单项、按钮、键盘快捷键等用户界面元素的操作。
具体类图如下:
总而言之,言而总之,类的依赖关系如图,下面引入一个DEMO级别的示例。
示例代码
类图
Command
public interface Command {
void execute();
}
Receiver 类
public class Receiver {
public void action(String cmd){
System.out.println("hello i am action , from cmd :"+cmd);
}
}
ConcreteCommand
public class ConcreteCommand implements Command{
String cmd="i am concrete";
Receiver receiver;
public ConcreteCommand(Receiver receiver){
this.receiver=receiver;
}
@Override
public void execute() {
receiver.action(cmd);
}
}
Invoker
public class Invoker {
private Command cmd;
public void setCmd(Command cmd){
this.cmd=cmd;
}
public void executeCmd(){
cmd.execute();
}
}
Client
public class Client {
public static void main(String[] args) {
System.out.println("hello , i am cmd design pattern");
Receiver receiver=new Receiver();
Command cmd=new ConcreteCommand(receiver);
Invoker invoker=new Invoker();
invoker.setCmd(cmd);
invoker.executeCmd();
}
}
后续会引入项目实例,进行实践性说明。