1. 程式人生 > >9.命令模式(Command Pattern)

9.命令模式(Command Pattern)

1.定義

將一個請求封裝成一個物件,從而讓你使用不同的請求把客戶端引數化,對請求排隊或者記錄請求日誌,可以提供命令的撤銷和恢復功能。
命令模式屬於行為模式。

2.命令模式的使用場景

只要我們認為是命令的地方就可以採用命令模式,比如在GUI開發中,一個按鈕的點選是一個命令;觸發-反饋機制的處理等。

3.命令模式的三個角色

  • Receive接收者角色:該角色就是幹活的角色,命令傳遞到這裡是應該被執行的。
  • Command命令角色:需要執行所有命令都在這裡宣告
  • Invoker呼叫者角色:接收到命令,並執行命令

4.命令模式的通用程式碼

package _9CommandPattern;

public abstract class Receiver {

	// 抽象接收者,定義每個接收者都必選完成的業務
	public abstract void doSomething();
}
 
package _9CommandPattern;

public class ConcreteReceiver extends Receiver {

	@Override
	public void doSomething() {
		// 每個接收者都必須處理一定的業務邏輯
		System.out.println("我在做好事");
	}

}
 
package _9CommandPattern;

public abstract class Command {

	// 抽象命令,每個命令都必須有一個執行命令的方法
	public abstract void execute();
}
 
package _9CommandPattern;

// 實體命令類
public class ConcreteCommand extends Command {

	private Receiver receiver;
	
	public ConcreteCommand(Receiver receiver)
	{
		this.receiver = receiver;
	}
	
	@Override
	public void execute() {
		receiver.doSomething();
	}

}
 
package _9CommandPattern;

// 呼叫者
public class Invoker {

	public void action(Command command) 
	{
		command.execute();
	}
}
 
package _9CommandPattern;

public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Command command = new ConcreteCommand(new ConcreteReceiver());
		new Invoker().action(command);
	}

}

5.命令模式的優點

  • 類間解耦:呼叫者與接受者角色之間沒有任何依賴,呼叫者實現功能時只需呼叫Commond抽象類的execute方法就可以,不需要了解到底哪個接收者執行
  • 可擴充套件性:Command的子類非常容易擴充套件,而呼叫者Invoker和高層次的模組Client不產生嚴重的程式碼耦合
  • 命令模式結合其他模式會更優秀:命令模式可以結合責任鏈模式,實現命令族解析任務;結合模板方法模式,則可以減少Command子類的膨脹問題

6.命令模式的缺點

請看Command類,如果有N個命令,問題就出來了,Command的子類就可不是幾個,而是N個,這個類膨脹的非常大,這個就需要在專案中慎重考慮。