設計模式(8)-命令模式詳解(易懂)

命令模式的定義

命令模式,將一組行爲抽象爲對象,實現兩者之間的鬆耦合。這就是命令模式(Command Pattern)。設計模式

模型:微信

image

  • Invoker:調用者,就是接收到命令後負責調用
  • Receiver:接受者,也就是執行命令的人,最苦逼的
  • Command:命令者,封裝好的命令類

下面經過通俗的實例來了解一下命令模式。ide


實例說明

既然命令,就拿「項目經理」-「開發人員」舉例吧,好比有個外包的項目須要開發,開發完成後甲方要求改一改某個功能。下面用代碼詳細說明一下:學習

1.首先定義一個抽象的Receiver,由於開發人員不止一我的this

public abstract class AbstractReceiver {

   //寫項目
   public abstract  void write();

   //增刪改項目
   public abstract  void change();

   //提交程序
   public abstract  void ubmit();
}

2.定義具體的Receiver,這裏假設有兩個開發人員spa

public class ReceiverA extends  AbstractReceiver{

   @Override
   public void write() {
       Log.d("qzs","寫代碼");
   }

   @Override
   public void change() {
       Log.d("qzs","改需求");
   }

   @Override
   public void submit() {
       Log.d("qzs","提交");
   }
}
public class ReceiverB extends AbstractReceiver {

   @Override
   public void write() {
       Log.d("qzs","寫代碼");
   }

   @Override
   public void change() {
       Log.d("qzs","改需求");
   }

   @Override
   public void submit() {
       Log.d("qzs","提交");
   }
}

3.定義Command,命令類,也就是剛纔說的甲方要求改一改某個功能的命令,假如此功能是開發人員A改:設計

public abstract class AbstractCommand  {
   ReceiverA receiverA=new ReceiverA();   //開發人員A
   ReceiverB receiverB=new ReceiverB();   //開發人員B

   //執行
   public abstract  void excute();
}
public class ChangeFunctionCommand extends AbstractCommand {
   @Override
   public void excute() {

       receiverA.change();
       receiverA.submit();
   }
}

4.定義Invoker類,也就是項目經理,負責安排調用code

public class Invoker  {

   private  AbstractCommand command;

   //設置命令
   public void setCommand(AbstractCommand command) {
       this.command = command;
   }

   // 執行命令
  public void Action(){
      command.excute();
  }

5.調用對象

//定義一個項目經理-張三
       Invoker ZHANGSAN=new Invoker();
       //定義修改功能的命令並執行
       AbstractCommand command=new ChangeFunctionCommand();
       ZHANGSAN.setCommand(command);
       ZHANGSAN.Action();

運行後:事務

image


命令模式的優缺點及其餘

1.優勢:

  • 下降對象之間的耦合度
  • 新的命令能夠很容易地加入到系統中
  • 能夠比較容易地設計一個組合命令
  • 調用同一方法實現不一樣的功能

2.缺點:

使用命令模式可能會致使某些系統有過多的具體命令類。由於針對每個命令都須要設計一個具體命令類,所以某些系統可能須要大量具體命令類,這將影響命令模式的使用。

3.使用場景:

  • 須要對行爲進行記錄,撤銷,重作,事務處理時
  • 須要抽象出待執行的動做,而後以參數的形式提供出來

4.附加:

若是有人問了,撤銷的操做怎麼作,其實很簡單。在抽象的接收類中定義一個「撤銷」的方法。而後再定義一個撤銷Command來增長這個撤銷命令就行了。

本文學習參考了《設計模式之禪》以及網上信息...

另外能夠加入個人Android技術交流羣:458739310
你們能夠關注個人微信公衆號:「安卓乾貨鋪」一個有質量、有態度的公衆號!

相關文章
相關標籤/搜索