定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
我们先来看一下命令模式的一般类图
在该类图中,我们可以看到三个角色,
1. Receiver接受者角色,该角色就是落实到最后代码实际执行了部分
2. Command命令角色,这是命令模式的核心类,我们通过扩展该类来实现多个命令的解耦。把请求方(Invoker)和执行方(Receiver)分开
3. Invoker调用者角色,接收到命令,并执行命令。一般充当中间的调和的角色,与我们实际生活中项目经理的角色类似
然后我们来大致讲一下命令模式,所谓命令模式,举个例子,就像是甲方乙方再加上个中介,甲方命令乙方做什么事,而不用细分到乙方的部门之下具体的操作。甲方告诉中介命令乙方做的事情,然后中介就规划如何运作,并领导乙方各个部门协调完成。
好了,说了这么多,我们还是来看一看命令模式的通用源码吧。
1.通用Receiver类
public abstract class Receiver {
//抽象接收者,定义每个接收者都必须完成的业务
public abstract void doSomething();
}
2.具体的Receiver类
public class ConcreteReciver1 extends Receiver{
//每个接受者都必须处理一定的业务逻辑
public void doSomething(){
}
}
public class ConcreteReciver2 extends Receiver{
//每个接受者都必须处理一定的业务逻辑
public void doSomething(){
}
}
3.抽象的command类
public abstract class Command {
//定义一个子类的全局共享变量
protected final Receiver receiver;
//实现类必须定义一个接收者
public Command(Receiver _receiver){
this.receiver = _receiver;
}
//每个命令类都必须有一个执行命令的方法
public abstract void execute();
}
4.具体的Command类
public class ConcreteCommand1 extends Command {
//声明自己的默认接收者
public ConcreteCommand1(){
super(new ConcreteReciver1());
}
//设置新的接收者
public ConcreteCommand1(Receiver _receiver){
super(_receiver);
}
//每个具体的命令都必须实现一个命令
public void execute() {
//业务处理
super.receiver.doSomething();
}
}
public class ConcreteCommand2 extends Command {
//声明自己的默认接收者
public ConcreteCommand2(){
super(new ConcreteReciver2());
}
//设置新的接收者
public ConcreteCommand2(Receiver _receiver){
super(_receiver);
}
//每个具体的命令都必须实现一个命令
public void execute() {
//业务处理
super.receiver.doSomething();
}
}
5.调用者Invoker类
public class Invoker {
private Command command;
//受气包,接受命令
public void setCommand(Command _command){
this.command = _command;
}
//执行命令
public void action(){
this.command.execute();
}
}
6.场景类
public class Client {
private static Invoker invoker;
private static Command command;
public static void main(String[] args) {
//首先声明出调用者Invoker
invoker = new Invoker();
//定义一个发送给接收者的命令
command = new ConcreteCommand1();
//把命令交给调用者去执行
invoker.setCommand(command);
invoker.action();
}
}