各位論壇會員大家好!
我已經徹底(在我看來)弄清楚了這個模式
Command
,我想嘗試「用我自己的話」來談論它。
根據維基百科,我們可以發現它的目的是
創建一個發送類別和接收類別不直接依賴的結構。組織對包含發送者類別的類別的回調。原則上寫得清楚、正確,但這只是理論上的。這個怎麼做?這就是問題開始的地方,因為… 描述不再那麼清晰和明顯。因此,我想通了,我決定告訴你我是如何理解它的,也許這對某人有用:基於對這個模式的目的的描述,我將把描述與代碼結合起來,使它更加清晰,因為 在同一個維基百科中,他們將其概括為多種語言,因此描述與範例分開。在這個模式中有四個術語,我們暫時認為它們是理所當然的:命令(
command
)、命令接收者(
receiver
)、命令呼叫者(
invoker
)和客戶端(
client
)。我將從同一個維基百科中舉一個例子,這是相當可以忍受的。
任務 是一個可以做兩件事的類別
Light
:開燈和關燈。就模式而言,它將是“命令接收者(
receiver
)”
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
)” 模式調用該方法
public interface Command{
void execute();
}
有必要封裝類別技能的執行
Light
。為此,我們將創建類別
TurnOnLightCommand
並
TurnOffLightCommand
實作接口
Command
,並將在建構函數中接受類別物件
Light
。而他們每個人只會執行一個動作。一個將調用該方法
turnOn()
,另一個將調用
turnOff()
。
public class TurnOnLightCommand implements Command{
private Light theLight;
public TurnOnLightCommand(Light light){
this.theLight=light;
}
public void execute(){
theLight.turnOn();
}
}
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()
。
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 方法,所有操作都將在其中發生:
public class TestCommand{
public static void main(String[] args){
Light l=new Light();
Command switchUp=new TurnOnLightCommand(l);
Command switchDown=new TurnOffLightCommand(l);
Switch s=new Switch(switchUp,switchDown);
s.flipUp();
s.flipDown();
}
}
輸出如下:
"The light is on"
"The light is off"
這個應用在哪裡呢?
目的很明確需要什麼以及為什麼需要這樣做,即:在需要分離特定執行的情況下,這非常方便。這樣某些功能的使用不依賴於具體的實現,並且可以在不損壞系統的情況下進行更改。像這樣的東西...)寫下你的評論,讓我們討論,也許有些事情可以變得更簡單,講得更好,如果有必要我們會編輯所有內容)這樣對於那些第一次閱讀的人來說,它會盡可能清晰。好吧,喜歡這篇文章的人就在上面加一個「+」:)這對我來說很重要)隨著時間的推移,我想寫更多關於
Builder
、
Singleton
和其他的內容。
另請參閱我的其他文章:
GO TO FULL VERSION