java設計模式(1):命令模式
阿新 • • 發佈:2019-02-12
命令模式
在一些需求場景中,有發出命令的物件,有執行命令的物件,有具體的命令。但是如果要將這些模型抽象出來可以複用,這就是常見的命令模式。
命令模式中的5個角色
(1)呼叫者:負責呼叫命令物件,執行命令物件的方法
(2)執行者:具體執行某一方法
(3)抽象命令:一個介面或抽象類,讓具體命令實現
(4)具體命令:實現抽象命令的具體方法
(5)客戶端:建立具體的命令物件和其接受者,並執行請求
應用場景
比如我現在在鍵盤上打字輸入文字,我的角色就是客戶端,鍵盤就是呼叫者,而電腦就是執行者,我在鍵盤上輸入新增,撤銷,恢復命令。就會在電腦上同步顯示出來。整個過程就是命令模式。
比如領導命令下屬列印一份放假檔案,領導就是呼叫者,下屬就是執行者,列印一份檔案就是抽象命令,列印具體的放假命令就是具體的命令。在這個命令模式中,領導不關心具體是哪個下屬去列印,下屬也不知道給哪位領導在列印,他能列印很多檔案,當前這一刻他只打印一份放假的檔案。這樣耦合度更低。
程式碼示例
(1)呼叫者Invoker
public class Invoker {
private Command command;
// 構造注入
public Invoker(Command command){
this.command = command;
}
// 設值注入
public void setCommand(Command command){
this.command = command;
}
// 業務方法,用於呼叫命令類
public void call(){
command.execute();
}
}
(2)執行者Receiver
public class Receiver {
public void action(String action) {
System.out.println(action);
}
}
(3)抽象命令Command
public abstract class Command {
public abstract void execute();
}
(4)具體命令
新增ConcreteCommandAdd
public class ConcreteCommandAdd extends Command{ // 與請求接收者相關聯 private Receiver receiver; public ConcreteCommandAdd(Receiver receiver){ this.receiver = receiver; } @Override public void execute() { receiver.action("add action"); } }
恢復ConcreteCommandRedo
public class ConcreteCommandRedo extends Command{
// 與請求接收者相關聯
private Receiver receiver;
public ConcreteCommandRedo(Receiver receiver){
this.receiver = receiver;
}
@Override
public void execute() {
receiver.action("redo action");
}
}
撤銷ConcreteCommandUndo
public class ConcreteCommandUndo extends Command{
// 與請求接收者相關聯
private Receiver receiver;
public ConcreteCommandUndo(Receiver receiver){
this.receiver = receiver;
}
@Override
public void execute() {
receiver.action("undo action");
}
}
(5)客戶端Test
public class Test {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command ccAdd = new ConcreteCommandAdd(receiver);
Command ccRedo = new ConcreteCommandRedo(receiver);
Command ccUndo = new ConcreteCommandUndo(receiver);
Invoker invokerccAdd = new Invoker(ccAdd);
Invoker invokerccRedo = new Invoker(ccRedo);
Invoker invokerccUndo = new Invoker(ccUndo);
invokerccAdd.call();
invokerccRedo.call();
invokerccUndo.call();
}
}
執行結果:
add action
redo action
undo action