乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      命令模式.

       新進(jìn)小設(shè)計(jì) 2020-07-19

      一、概念

      • 命令模式:將“請(qǐng)求”封裝成對(duì)象,以便使用不同的請(qǐng)求、隊(duì)列或者日志來(lái)參數(shù)化其他對(duì)象。命令模式也支持可撤銷(xiāo)的操作。
      • 角色:
        ?1、命令(Command):為所有命令聲明了一個(gè)接口。調(diào)用命令對(duì)象的 execute()方法,就可以讓接收者進(jìn)行相關(guān)的操作。這個(gè)接口也具備一個(gè) undo() 方法。
        ?2、具體命令(ConcreteCommand):實(shí)現(xiàn)命令接口,定義了動(dòng)作和接收者之間的綁定關(guān)系。調(diào)用者只要調(diào)用 execute() 就可以發(fā)出請(qǐng)求,然后由 ConcreteCommand 調(diào)用接收者的一個(gè)或多個(gè)動(dòng)作。
        ?3、請(qǐng)求者(Invoker):持有一個(gè)命令對(duì)象,有一個(gè)行動(dòng)方法,在某個(gè)時(shí)間點(diǎn)調(diào)用命令對(duì)象的 execute() 方法,將請(qǐng)求付諸實(shí)行。
        ?4、接收者(Receiver):接收者知道如何進(jìn)行必要的動(dòng)作,實(shí)現(xiàn)這個(gè)請(qǐng)求。任何類(lèi)都可以當(dāng)接收者。
        ?5、客戶(hù)端(Client):創(chuàng)建一個(gè)具體命令(ConcreteCommand)對(duì)象并確定其接收者,包括把其他角色串連在一起。

      avatar

      二、Demo 實(shí)現(xiàn)

      Topic:我們要制作一個(gè)簡(jiǎn)易的遙控器,有兩個(gè)控制燈開(kāi)關(guān)的按鈕,并有一個(gè)操作回退按鈕。

      1、接收者

      ?首先,我們先來(lái)定義一個(gè)接收者的角色,也就是最后執(zhí)行動(dòng)作的那個(gè)對(duì)象 —— Light.java,控制著燈的開(kāi)啟和關(guān)閉。

      public class Light {
      
          public void on() {
              System.out.println("燈亮了...");
          }
      
          public void off() {
              System.out.println("燈暗了...");
          }
      }
      

      2、命令

      ?現(xiàn)在,我們要定義一個(gè)命令角色。一般是一個(gè)接口,為所有的命令對(duì)象聲明一個(gè)接口,規(guī)范將要進(jìn)行的命令操作。

      public interface Command {
          /**
           * 執(zhí)行命令
           */
          void execute();
      
          /**
           * 撤銷(xiāo)命令
           */
          void undo();
      }
      

      3、具體命令

      ?有了命名角色后,我們要構(gòu)建具體命令角色。具體命令實(shí)現(xiàn)了命令接口,定義了動(dòng)作和接收者之間的綁定關(guān)系。這里,我們有兩個(gè)具體命令對(duì)象—— LightOnCommand.java(開(kāi)燈命令)、LightOffCommand.java(關(guān)燈命令)

      public class LightOnCommand implements Command {
      
          private Light light;
      
          public LightOnCommand(Light light) {
              this.light = light;
          }
      
          @Override
          public void execute() {
              light.on();
          }
      
          @Override
          public void undo() {
              light.off();
          }
      }
      
      public class LightOffCommand implements Command {
      
          private Light light;
      
          public LightOffCommand(Light light) {
              this.light = light;
          }
      
          @Override
          public void execute() {
              light.off();
          }
      
          @Override
          public void undo() {
              light.on();
          }
      }
      

      4、請(qǐng)求者

      ?前面,我們定義了動(dòng)作的接收方和聯(lián)系中介 —— 命名對(duì)象?,F(xiàn)在,我們要著手構(gòu)建請(qǐng)求者角色了。請(qǐng)求者持有一個(gè)命令對(duì)象,有一個(gè)行動(dòng)方法。它會(huì)在某個(gè)時(shí)間點(diǎn)執(zhí)行行動(dòng)方法,但不關(guān)心是誰(shuí)具體執(zhí)行了這個(gè)動(dòng)作。

      public class RemoteInvoker {
      
          /**
           * 開(kāi)關(guān)命令數(shù)組,模擬有很多對(duì)開(kāi)關(guān)數(shù)組
           */
          private Command[] onCommands;
          private Command[] offCommands;
          /**
           * 撤銷(xiāo)(回退)命令
           */
          private Command undoCommand;
      
          public RemoteInvoker(int length) {
              // 有幾組開(kāi)關(guān),就設(shè)置多少數(shù)組
              onCommands = new Command[length];
              offCommands = new Command[length];
              // 把每個(gè)命令初始化成空命令,避免空指針異常
              Command noCommand = new NoCommand();
              undoCommand = noCommand;
              for (int i = 0; i < length; i++) {
                  onCommands[i] = noCommand;
                  offCommands[i] = noCommand;
              }
          }
      
          /**
           * @Description 設(shè)置命令對(duì)象
           * @date 2018/11/29 09:15
           * @param slot 遙控器的位置
           * @param onCommand 開(kāi)的命令
           * @param offCommand 關(guān)的命令
           * @return void
           */
          public void setCommond(int slot, Command onCommand, Command offCommand) {
              onCommands[slot] = onCommand;
              offCommands[slot] = offCommand;
          }
      
      
          public void onButton(int slot) {
              onCommands[slot].execute();
              //為撤銷(xiāo)(回退)按鈕記錄動(dòng)作
              undoCommand = onCommands[slot];
          }
      
          public void offButton(int slot) {
              offCommands[slot].execute();
              //為撤銷(xiāo)(回退)按鈕記錄動(dòng)作
              undoCommand = offCommands[slot];
          }
      
          public void undoButton() {
              undoCommand.undo();
          }
      }
      

      5、客戶(hù)端

      ?前面,我們定義好了請(qǐng)求者、接收者已經(jīng)兩者之間的聯(lián)系中介 —— 命令對(duì)象。但是這幾個(gè)角色對(duì)象之間都是松耦合的,還沒(méi)有一個(gè)具體動(dòng)作的流程,現(xiàn)在我們利用客戶(hù)端角色把整個(gè)動(dòng)作流程串聯(lián)在一起。

      public class RemoteClient {
      
          public static void main(String[] args) {
              // 1、創(chuàng)建接收者
              Light light = new Light();
              // 2、創(chuàng)建命令對(duì)象
              LightOnCommand lightOnCommand = new LightOnCommand(light);
              LightOffCommand lightOffCommand = new LightOffCommand(light);
              // 3、創(chuàng)建一組開(kāi)關(guān)并用命令對(duì)象裝載它
              RemoteInvoker invoker = new RemoteInvoker(1);
              invoker.setCommond(0, lightOnCommand, lightOffCommand);
              // 4、測(cè)試
              invoker.onButton(0);
              invoker.offButton(0);
              invoker.undoButton();
          }
      }
      

      avatar

      三、總結(jié)

      • 命令模式將發(fā)出請(qǐng)求的對(duì)象和執(zhí)行請(qǐng)求的對(duì)象解耦,在被解耦的兩者之間是通過(guò)命令對(duì)象進(jìn)行溝通的。
      • 一個(gè)命令對(duì)象通過(guò)在特定接收者上綁定一組動(dòng)作來(lái)封裝一個(gè)請(qǐng)求。要達(dá)到這一點(diǎn),命令對(duì)象將接收者和動(dòng)作封裝進(jìn)對(duì)象中,這個(gè)對(duì)象只暴露出一個(gè) execute() 方法,當(dāng)此方法被調(diào)用時(shí),接收者就會(huì)進(jìn)行這些動(dòng)作。從外面來(lái)看,其他對(duì)象不知道究竟哪個(gè)接收者進(jìn)行了哪些操作,只知道如果調(diào)用 execute() 方法,請(qǐng)求的目的就可以達(dá)到。
      • 當(dāng)你不想返回一個(gè)有意義的對(duì)象時(shí),空對(duì)象就很有用。這樣,我們就可以把處理 null 的責(zé)任轉(zhuǎn)移給空對(duì)象,甚至有些時(shí)候,空對(duì)象本身也被視為一種設(shè)計(jì)模式。
      • 我們還可以把一堆命令組裝起來(lái)拼成一個(gè)命令,稱(chēng)為宏命令。宏命令是命令的一種延伸,允許調(diào)用一系列的命令。包括一系列的執(zhí)行和撤銷(xiāo)動(dòng)作。
      • 適用場(chǎng)景:
        ?1、命令的發(fā)送者和命令執(zhí)行者有不同的生命周期,命令發(fā)送了并不是立即執(zhí)行。換言之,原先的請(qǐng)求發(fā)出者可能已經(jīng)不在了,而命令對(duì)象本身仍然是活動(dòng)的。這時(shí)命令的接收者可以是在本地,也可以在網(wǎng)絡(luò)的另外一個(gè)地址。命令對(duì)象可以在序列化之后傳送到另外一臺(tái)機(jī)器上去。 ?2、命令需要進(jìn)行各種管理邏輯,比如:對(duì)多個(gè)命令的統(tǒng)一控制。
        ?3、需要支持撤消/重試操作。命令對(duì)象可以把狀態(tài)存儲(chǔ)起來(lái),等到客戶(hù)端需要撤銷(xiāo)命令所產(chǎn)生的效果時(shí),可以調(diào)用 undo()方法,把命令所產(chǎn)生的效果撤銷(xiāo)掉。命令對(duì)象還可以提供 redo()方法, 以供客戶(hù)端在需要時(shí)再重新實(shí)施命令效果。 ?4、使用命令模式作為 "回調(diào)(callBack)" 在面向?qū)ο笙到y(tǒng)中的替代。"callBack" 講的便是先將一個(gè)函數(shù)登記上,然后在以后調(diào)用此函數(shù)。 ?5、如果要將系統(tǒng)中所有的數(shù)據(jù)更新到日志里,以便在系統(tǒng)崩潰時(shí),可以根據(jù)日志讀回所有的數(shù)據(jù)更新命令,重新調(diào)用 execute() 方法一條一條執(zhí)行這些命令,從而恢復(fù)系統(tǒng)在崩潰前所做的數(shù)據(jù)更新。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶(hù) 評(píng)論公約

        類(lèi)似文章 更多