1. 程式人生 > >java設計模式(1):命令模式

java設計模式(1):命令模式

命令模式

在一些需求場景中,有發出命令的物件,有執行命令的物件,有具體的命令。但是如果要將這些模型抽象出來可以複用,這就是常見的命令模式。

命令模式中的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