9.命令模式(Command Pattern)
阿新 • • 發佈:2019-02-09
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個,這個類膨脹的非常大,這個就需要在專案中慎重考慮。