前言
在日常生活中,我们使用电脑,手机等数码产品。往往有开机,关机的行为。对于电脑,通常我们按开机键开机,而在系统菜单中点击关机命令关机。而手机也是类似。我们作为数码产品的使用者,并不知道开机,关机命令的具体执行逻辑,手机和电脑已经把开关机的具体逻辑和细节封装成了两个简单的操作。我们只需要简单的执行开关机命令即可。而这就是命令模式在生活中的应用,同样,在软件程序设计中,命令模式也有各种应用。
是什么
命令模式(Command Pattern):将一个请求封装为一个对象,从而让我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。
如下,是命令模式的结构图,其中
- Command 抽象命令类,一般是抽象类或者接口哦,在其中声明了用于执行请求的
excute()
方法。 - ConcreteCommand 具体命令类,实现抽象命令类中声明的方法。
- Invoker 表示调用者,也就是请求的发送者,通过命令对象执行请求。
- Receiver 命令的接收者,具体实现对命令请求的业务处理。
为什么
简单来说,就是为了解耦。设计模式在创建之初就是为了满足软件开发的灵活性。命令模式的初衷就是将命令调用者和命令接收者解耦开。
怎么做
下面通过几段Java代码来简单了解下命令模式的具体实现:
抽象命令类
public interface Command {
void execute();
}
具体命令类
public class ConcreteCommand implements Command {
//接收者
private Receiver receiver;
public ConcreteCommand(Receiver receiver){
this.receiver = receiver;
}
@Override
public void execute() {
System.out.println("命令:"+getClass().getSimpleName()+"已经交给接收者:"+this.receiver.toString()+"执行了!");
receiver.action();
}
}
接收者类
public class Receiver {
public void action(){
System.out.println("接收者"+this.toString()+"的具体业务操作");
}
}
调用者类
/**
* 调用者/请求发送者
*/
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.toString()+"命令!");
command.execute();
}
}
具体的客户端调用
public class Client {
public static void main(String[]args){
//命令的接收者
Receiver receiver = new Receiver();
//具体命令
Command command = new ConcreteCommand(receiver);
//调用者
Invoker invoker = new Invoker(command);
//调用命令
invoker.call();
}
}
运行结果: