命令模式【行为模式】

命令模式

Encapsulate a request as an object,thereby letting you parameterize clients with
different requests,queue or log requests,and support undoable operations.
将一个请求封装为一个对象,从而允许你对客户端的不同请求,队列或日志请求参数化,并支持撤销操作。
public class Command {
    /**
     * 命令模式:
     * Encapsulate a request as an object,thereby letting you parameterize clients with
     * different requests,queue or log requests,and support undoable operations.
     * 将一个请求封装为一个对象,从而允许你对客户端的不同请求,队列或日志请求参数化,并支持撤销操作。
     */
    @Test
    public void all() {
        final AddCommand addCommand = AddCommand.builder().build();
        final UpdateCommand updateCommand = UpdateCommand.builder().build();
        final Invoker invoker = Invoker.builder().build();

        invoker.setCommand(addCommand);
        invoker.invoke();

        invoker.setCommand(updateCommand);
        invoker.invoke();
    }

}
/**
 * 1)有效的操作行为
 */
interface IOperate {
    void find();

    void add();

    void update();

    void delete();
}

/**
 * 2)具体的行为实现者:UCD 组支持的操作
 */
@Slf4j
class UCD implements IOperate {

    @Override
    public void find() {
        log.info("找到 UCD 组");
    }

    @Override
    public void add() {
        log.info("UCD 组增加一项需求");
    }

    @Override
    public void update() {
        log.info("UCD 组修改一项需求");
    }

    @Override
    public void delete() {
        log.info("UCD 组取消一项需求");
    }

}

/**
 * UI 组支持的操作
 */
@Slf4j
class UI implements IOperate {

    @Override
    public void find() {
        log.info("找到 UI 组");
    }

    @Override
    public void add() {
        log.info("UI 组增加一项需求");
    }

    @Override
    public void update() {
        log.info("UI 组修改一项需求");

    }

    @Override
    public void delete() {
        log.info("UI 组取消一项需求");

    }

}

/**
 * Coder 组支持的操作
 */
@Slf4j
class Coder implements IOperate {

    @Override
    public void find() {
        log.info("找到代码组");
    }

    @Override
    public void add() {
        log.info("代码组增加一项需求");
    }

    @Override
    public void update() {
        log.info("代码组修改一项需求");
    }

    @Override
    public void delete() {
        log.info("代码组删除一项需求");
    }

}

/**
 * 3)抽象命令类,指定了所有有效的操作
 */
abstract class ACommand {
    protected final IOperate ucd = new UCD();
    protected final IOperate ui = new UI();
    protected final IOperate coder = new Coder();

    abstract public void execute();
}

/**
 * 4)具体命令类:新增一个功能
 */
@Builder
class AddCommand extends ACommand {

    @Override
    public void execute() {
        ucd.find();
        ucd.add();
        ui.find();
        ui.add();
        coder.find();
        coder.add();
    }
}

/**
 * 修改一个功能
 */
@Builder
class UpdateCommand extends ACommand {

    @Override
    public void execute() {
        ui.find();
        ui.update();
        coder.find();
        coder.update();
    }

}

/**
 * 5)命令执行者
 */
@Builder
class Invoker {
    private ACommand command;

    public void setCommand(ACommand command) {
        this.command = command;
    }

    public void invoke() {
        command.execute();
    }
}
原文地址:https://www.cnblogs.com/zhuxudong/p/10165465.html