简介
将“请求”封装成对象,以便使用不同的请求,命令模式解决了应用程序中对象的职责以及它们之间的通信方式,类将请求委托给command对象,而不是直接实现特定的请求,该模式属于行为型。
命令模式包含几个角色:command, receiver, invoker和client。command对象知道receiver对象并调用receiver对象的方法,receiver方法的参数值存储在命令中,执行这些方法的receiver对象也通过聚合存储在command对象中。
当execute()方法在command中被调用时,receiver会进行工作,invoker对象知道怎么执行command对象,但是对command内部的实现是不知道的,因为它只知道command的接口,在client中会调用invoker对象、command对象和receiver对象,client决定哪个receiver对象分配给command对象,哪个command对象分配给invoker对象,client决定哪个点执行哪个command,当执行命令时,它将command对象传递给invoker对象。
适用场景
1、请求调用者和请求接收者需要解耦,使调用者和接收者不直接交互
2、需要抽象出等待执行的行为
3、应该可以使用请求配置对象(调用请求的对象)
优点
1、降低耦合
2、容易扩展新命令
缺点
1、命令的无限扩展会增加类的数量,增加系统复杂性
代码示例
//command接口
public interface Command {
void execute();
}
//Receiver类
public class Light {
public void turnOn(){
System.out.println("开灯");
}
public void turnOff(){
System.out.println("关灯");
}
}
//Invoker
public class Switch {
private final HashMap<String, Command> commandMap = new HashMap<>();
public void register(String commandName, Command command) {
commandMap.put(commandName, command);
}
public void execute(String commandName) {
Command command = commandMap.get(commandName);
if (command == null) {
throw new IllegalStateException("no command registered for " + commandName);
}
command.execute();
}
}
//command接口实现类
public class SwitchOffCommand implements Command{
private Light light;
public SwitchOffCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOff();
}
}
//command接口实现类
public class SwitchOnCommand implements Command {
private Light light;
public SwitchOnCommand(Light light) {
this.light = light;
}
@Override
public void execute() {
light.turnOn();
}
}
//client类
public class CommandTest {
public static void main(String[] args) {
Light lamp = new Light();
Command switchOn = new SwitchOnCommand(lamp);
Command switchOff = new SwitchOffCommand(lamp);
Switch mySwitch = new Switch();
mySwitch.register("on", switchOn);
mySwitch.register("off", switchOff);
mySwitch.execute("on");
mySwitch.execute("off");
}
}
输出结果为:
开灯
关灯
源码分析
jdk中应用
Runnable
是一个command接口,线程池中通过addTask()方法,把Runnable实现类放到队列中,接着会从队列中执行任务。
junit中应用
public abstract class TestCase implements Test {
private final String fName;
public TestCase(String name) {
fName= name;
}
public abstract void run();
}
本文为博主原创文章,未经博主允许不得转载。
更多内容请访问:IT源点
注意:本文归作者所有,未经作者允许,不得转载