JavaRush /Java Blog /Random-TW /用自己的話來說命令模式
Roman_kh
等級 33
Харьков

用自己的話來說命令模式

在 Random-TW 群組發布

各位論壇會員大家好!

我已經徹底(在我看來)弄清楚了這個模式Command,我想嘗試「用我自己的話」來談論它。 用自己的話來說命令模式 - 1根據維基百科,我們可以發現它的目的是創建一個發送類別和接收類別不直接依賴的結構。組織對包含發送者類別的類別的回調。原則上寫得清楚、正確,但這只是理論上的。這個怎麼做?這就是問題開始的地方,因為… 描述不再那麼清晰和明顯。因此,我想通了,我決定告訴你我是如何理解它的,也許這對某人有用:基於對這個模式的目的的描述,我將把描述與代碼結合起來,使它更加清晰,因為 在同一個維基百科中,他們將其概括為多種語言,因此描述與範例分開。在這個模式中有四個術語,我們暫時認為它們是理所當然的:命令(command)、命令接收者(receiver)、命令呼叫者(invoker)和客戶端(client)。我將從同一個維基百科中舉一個例子,這是相當可以忍受的。 任務 是一個可以做兩件事的類別Light:開燈和關燈。就模式而言,它將是“命令接收者(receiver)”
/*Receiver class*/

public class Light{
     public Light(){  }

     public void turnOn(){
        System.out.println("The light is on");
     }

     public void turnOff(){
        System.out.println("The light is off");
     }
}
讓我們創建一個接口,其中包含一個execute()將執行的方法,並根據“命令 ( command)” 模式調用該方法
/*the Command interface*/

public interface Command{
    void execute();
}
有必要封裝類別技能的執行Light。為此,我們將創建類別TurnOnLightCommandTurnOffLightCommand實作接口Command,並將在建構函數中接受類別物件Light。而他們每個人只會執行一個動作。一個將調用該方法turnOn(),另一個將調用turnOff()
/*the Command for turning on the light*/

public class TurnOnLightCommand implements Command{
   private Light theLight;

   public TurnOnLightCommand(Light light){
        this.theLight=light;
       }

   public void execute(){
      theLight.turnOn();
   }
}

/*the Command for turning off the light*/

public class TurnOffLightCommand implements Command{
   private Light theLight;

   public TurnOffLightCommand(Light light){
        this.theLight=light;
       }

   public void execute(){
      theLight.turnOff();
   }
}
現在是時候建立一個接受這些封裝的物件方法的物件了Light。從模式上來說,它被稱為命令調用者(invoker)。讓我們呼叫它Switch並讓它接受建構函數中的變量Command,這些變數將在創建的方法flipUp()和中使用flipDown()
/*the Invoker class*/

public class Switch {
    private Command flipUpCommand;
    private Command flipDownCommand;

    public Switch(Command flipUpCommand,Command flipDownCommand){
         this.flipUpCommand=flipUpCommand;
         this.flipDownCommand=flipDownCommand;
    }

    public void flipUp(){
         flipUpCommand.execute();
    }

    public void flipDown(){
         flipDownCommand.execute();
    }
}
當然,我們將創建一個類,使用它們來了解一般情況。它將被稱為 main 方法,所有操作都將在其中發生:
/*The test class*/
public class TestCommand{
   public static void main(String[] args){
       // создаем an object, который будет использоваться
       Light l=new Light();
       // создаем an objectы для всех умений an object Light:
       Command switchUp=new TurnOnLightCommand(l);
       Command switchDown=new TurnOffLightCommand(l);

       // Создаемтся invoker, с которым мы будем непосредственно контактировать:
       Switch s=new Switch(switchUp,switchDown);

       // вот проверка этого, используем методы:
       s.flipUp();
       s.flipDown();
   }
}
輸出如下:
"The light is on"
"The light is off"

這個應用在哪裡呢?

目的很明確需要什麼以及為什麼需要這樣做,即:在需要分離特定執行的情況下,這非常方便。這樣某些功能的使用不依賴於具體的實現,並且可以在不損壞系統的情況下進行更改。像這樣的東西...)寫下你的評論,讓我們討論,也許有些事情可以變得更簡單,講得更好,如果有必要我們會編輯所有內容)這樣對於那些第一次閱讀的人來說,它會盡可能清晰。好吧,喜歡這篇文章的人就在上面加一個「+」:)這對我來說很重要)隨著時間的推移,我想寫更多關於BuilderSingleton和其他的內容。 另請參閱我的其他文章:
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION