命令模式

/ 设计模式

命令模式(Command)

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化

GoF23种设计模式中,属于行为型模式( Behavioral Patterns)

所谓参数化就是通过不同的命令参数,去发送对客户的请求。

命令模式通过封装请求,将命令的使用者与执行者解耦。使用者只用关系命令的下达与结果,而执行者只需关心执行的过程与处理,而不在乎其在何处被执行。

形象来说,你向外卖平台发送了下单命令,平台执行了下单命令,合理选择了配送员及配送路线,最终你在家门口收到了外卖。命令模式就是把你和平台的通信进行解耦,让你只关注外卖的送达与品尝,如何配送怎么送达?这些处理过程与你点外卖行为进行解耦。

实例

命令模式总览

角色说明

举例

假设我们有个家务机器人,我们可以通过命令模式让它执行家务劳动。

命令模式举例

角色说明

code

public interface Command {
    void execute(String name);
}
public class WashClothesCommand implements Command{

    private Housework housework;

    public WashClothesCommand(Housework housework) {
        this.housework = housework;
    }

    @Override
    public void execute(String name) {
        housework.washClothes(name);
    }
}
public class CookCommand implements Command {

    private Housework housework;

    public CookCommand(Housework housework) {
        this.housework = housework;
    }

    @Override
    public void execute(String name) {
        housework.cook(name);
    }
}
public class Robot {
    private List<Command> commandList = new ArrayList<>();

    private String robotName;

    public Robot(String robotName) {
        this.robotName = robotName;
    }

    public void addCommand(Command command) {
        commandList.add(command);
    }

    public void execute() {
        for (Command c : commandList) {
            c.execute(robotName);
        }
        commandList.clear();
    }
}
public class Housework {

    private String houseName;

    public Housework(String houseName) {
        this.houseName = houseName;
    }

    public void washClothes(String name) {
        System.out.println(houseName + "家中," + name + "洗好了衣服");
    }

    public void cook(String name) {
        System.out.println(houseName + "家中," + name + "做好了饭");
    }
}
public class Client {
    public static void main(String[] args) {

        Robot robot = new Robot("未来机器人1号");
        Housework housework = new Housework("ordin");

        //下命令
        robot.addCommand(new WashClothesCommand(housework));
        robot.addCommand(new CookCommand(housework));
        
        //执行
        robot.execute();
    }
}
ordin家中,未来机器人1号洗好了衣服
ordin家中,未来机器人1号做好了饭

实例

这里的Runnable接口可看做命令接口,我们可以通过线程池来批量执行Runnable命令,而具体的命令内容可以由我们自定义实现。

总结

命令模式通过解耦请求者与执行者逻辑,从而降低系统耦合,利于系统拓展。