一、背景
想像一下,如果一个军官要派他的A下属去炸碉堡,B下属去炸军火库,C下属去狙击敌军头目,如果要安排下属的执行步骤及具体细节,军官是不是得累死?同样,如果系统中要去执行某些操作,怎么办?直接new出对象然后执行该操作的方法?如果该操作是多个方法的组合呢?是不是好累,而且如果想要执行的操作多了,想想这个工作量~,所以命令模式出现了。
二、概念
回顾我们看过的电视电影,军官要派下属们去执行某个任务,是不是给一个命令就ok。同样我们的命令模式也是这样,像我们打开windows 的dos操作界面,或者linux的shell客户端,要执行什么操作给个命令,管他什么三七二十一,各种细节由命令的底层代码去实现,我们只需轻松的记得哪个命令是什么功能就ok。
命令模式:在软件系统中 “行为请求者”通常与 “行为实现者” 呈现一种紧耦合。在某些场合,如果需对行为进行 记录,撤销,事物等操作,这种无法应对变化的紧耦合是不合适的。这种情况下 将“行为请求者”与 “行为实现者”进行解耦,将一组行为抽象为对象,实现二者间的松耦合。这就是命令模式。
三、代码实例
/**
* 命令接口
*/
interface Command {
public void exe();
}
/**
* 传递命令角色 减轻命令者与被命令者的耦合关系
*/
class Invoker {
private Command command;
public Invoker(Command command) {
this.command = command;
}
public void action() {
command.exe();
}
}
/**
* 具体的命令
*
*/
class MyCommand implements Command {
private Receiver receiver;
public MyCommand(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void exe() {
receiver.action();
}
}
/**
* 具体的执行命令类(命令接收者)
*/
class Receiver {
public void action() {
System.out.println("执行命令!");
}
}
public class CommandPatternDemo {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command command = new MyCommand(receiver);
Invoker invoker = new Invoker(command);
invoker.action();
}
}