命令模式【行為模式】
阿新 • • 發佈:2018-12-23
命令模式
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(); } }