1. 程式人生 > >命令模式【行為模式】

命令模式【行為模式】

命令模式

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