定义:
命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
目的:
将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。
主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

何时使用:
在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。

如何解决:
通过调用者调用接受者执行命令,顺序:调用者→命令→接受者。

关键代码:定义三个角色:1、received 真正的命令执行对象 2、Command 3、invoker 使用命令对象的入口

主要涉及到以下几个核心角色:

命令(Command):
    定义了执行操作的接口,通常包含一个 execute 方法,用于调用具体的操作。

具体命令(ConcreteCommand):
    实现了命令接口,负责执行具体的操作。它通常包含了对接收者的引用,通过调用接收者的方法来完成请求的处理。

接收者(Receiver):
    知道如何执行与请求相关的操作,实际执行命令的对象。

调用者/请求者(Invoker):
    发送命令的对象,它包含了一个命令对象并能触发命令的执行。调用者并不直接处理请求,而是通过将请求传递给命令对象来实现。

客户端(Client):
    创建具体命令对象并设置其接收者,将命令对象交给调用者执行。
// 定义士兵类
class Soldier {
    public void attack() {
        System.out.println("士兵发起进攻!");
    }
}

// 定义长官类
class Commander {
    private Soldier soldier;

    public Commander(Soldier soldier) {
        this.soldier = soldier;
    }

    // 定义命令接口
    interface Command {
        void execute();
    }

    // 定义具体命令,即长官下达的命令
    class AttackCommand implements Command {
        @Override
        public void execute() {
            soldier.attack();
        }
    }

    // 设置命令
    public void setCommand(Command command) {
        this.command = command;
    }

    // 发布命令
    public void issueCommand() {
        command.execute();
    }

    private Command command;
}

// 客户端
public class CommandPatternExample {
    public static void main(String[] args) {
        // 创建士兵
        Soldier soldier = new Soldier();
        // 创建长官,并指定士兵
        Commander commander = new Commander(soldier);
        // 创建具体命令对象,并设置给长官
        Commander.Command command = commander.new AttackCommand();
        commander.setCommand(command);
        // 长官发布命令
        commander.issueCommand();
    }
}

代码运行截图
设计模式之命令模式-LMLPHP

02-17 08:10