【设计模式】命令模式

star2017 1年前 ⋅ 834 阅读

简介

将“请求”封装成对象,以便使用不同的请求,命令模式解决了应用程序中对象的职责以及它们之间的通信方式,类将请求委托给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、命令的无限扩展会增加类的数量,增加系统复杂性

代码示例

image.png

//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();   
}

image.png

本文为博主原创文章,未经博主允许不得转载。
更多内容请访问:IT源点

相关文章推荐

全部评论: 0

    我有话说: