命令模式下的Java功能模块划分主要有以下三个部分,一是调用者,二是命令,三是执行者。通常情况下,调用者通过执行其action()方法,完成某一功能,而action()方法的具体实现,由具体的命令类和执行者类来实现。这种模式要实现的功能在于,对功能模块的封装,使得上层调用者仅需根据命令的不同,来执行命令,而不需要知道命令实现的细节。
首先来看命令模式的类图关系:
类图可以这样来解释:最底部的是Client,测试入口,它通过调用Invoker(调用者),并下达具体的命令Command1和Command2,来完成一个功能操作。其中Invoker依赖于Command(命令)类,而Command类依赖于具体的执行者Operator类。Command以及Operator类通常被设定为抽象类,并由这二者衍生出具体的命令类以及执行者类。
其实例代码,分别如下:
Operator.java
/**
* Created by Song on 2016/10/21.
* 抽象执行者
*/
public abstract class Operator {
public abstract void doSomething();
}
Operator1.java
/**
* Created by Song on 2016/10/21.
* 具体执行者1
*/
public class Operator1 extends Operator {
@Override
public void doSomething() {
System.out.println("双脚并拢,腰挺直,这是立正命令");
}
}
Operator2.java
/**
* Created by Song on 2016/10/21.
* 具体执行者2
*/
public class Operator2 extends Operator {
@Override
public void doSomething() {
System.out.println("右脚向前,这是稍息命令");
}
}
Command.java
/**
* Created by Song on 2016/10/21.
* 抽象命令
*/
public abstract class Command {
//依赖的执行者
protected Operator operator;
public Command(Operator _operator){this.operator=_operator;}
//执行命令
public abstract void execute();
}
Command1.java
/**
* Created by Song on 2016/10/21.
* 具体命令1
*/
public class Command1 extends Command {
public Command1(Operator _operator){super(_operator);}
public Command1(){super(new Operator1());}
@Override
public void execute() {
super.operator.doSomething();
}
}
Command2.java
/**
* Created by Song on 2016/10/21.
* 具体命令2
*/
public class Command2 extends Command {
public Command2(Operator _operator){super(_operator);}
public Command2(){super(new Operator2());}
@Override
public void execute() {
super.operator.doSomething();
}
}
Invoker.java
/**
* Created by Song on 2016/10/21.
* 调用者
*/
public class Invoker {
private Command command;
public void setCommand(Command _command){this.command = _command;}
public void action(){
this.command.execute();
}
}
测试方法Client.java
public class Client {
public static void main(String [] args){
//初始化调用者
Invoker invoker = new Invoker();
//执行命令1
invoker.setCommand(new Command1());
invoker.action();
//执行命令2
invoker.setCommand(new Command2());
invoker.action();
}
}
测试结果:
*双脚并拢,腰挺直,这是立正命令
右脚向前,这是稍息命令*