《Head First設計模式》之命令模式

2021-09-09 09:20:25 字數 2490 閱讀 3158

命令模式就是將方法呼叫(method invocation)封裝起來。通過封裝方法呼叫,我們可以把運算塊包裝成形,所以呼叫此運算的物件不需要關心事情是如何進行的,只要知道如何使用包裝成形的方法來完成它就可以了。通過封裝方法呼叫,可以用在以下場景:記錄日誌或者重複使用這些封裝來實現撤銷(undo)。

我對於命令模式的理解是:當我需要做一件事的時候,我只需要給出乙個命令,這個命令中的具體事情是如何實現的,與我無關,具體實現也不是我負責。我只要封裝好你的具體實現就行。然後發出我的命令,呼叫你的實現,最後完成我的命名。每個命令模式的提出,肯定是為了解決某種場景下的**耦合,而命令模式的提出是為了解決命令的請求者和命令的實現者之間的解耦。對於這類解耦的好處:我還沒想的特別清楚。

舉個例子來分析下命令模式在實際生活中的實現場景。比如說有一家餐館,有乙個顧客,有乙個服務員,有乙個廚師。顧客進去吃飯,會填寫乙份選單,交給服務員,服務員把選單交給廚師,由廚師做出顧客需要的菜。在這個場景中,顧客是命令的發出者,發出的命令就是那份選單,服務員只是命令的接收者,廚師才是命令的具體實現者。下面開始我會貼出集體的**,github位址是:

下面就是**例子:

命令就是lightoncommand

命令中動作的具體實現者就是light

命令的發出者就是remoteloader

命令的接收者是remotecontrol

來看看具體**:

command為所有命令宣告了乙個介面,呼叫命令物件的execute()方法,就可以讓接收者進行相關的動作。

public inte***ce command
lightoncommand實現execute()方法,在這個方法中會呼叫接收者的動作。

/**

* @auther: user

* @date: 2019/1/18 17:14

* @description:

*/public class lightoncommand implements command

@override

public void execute()

}

light類就是乙個功能類,也就是命令中某些動作的具體實現者

/**

* @auther: user

* @date: 2019/1/18 17:12

* @description:

*/public class light

/*** @description: 關閉燈開關

* @param

* @return

* @throws

* @author user

* @date 2019/1/18 17:13

*/public void off()

}

remotecontrol這個就是命令接收的地方,命令發出者會將命令傳送給remotecontrol,由remotecontrol類呼叫命令的execute方法來完成命令:

/**

* @auther: user

* @date: 2019/1/18 17:18

* @description:

*/public class remotecontrol

}public void setcommand(int slot, command oncommand, command offcommand)

public void onbuttonwaspushed(int slot)

public void offbuttonwaspushed(int slot)

}

remoteloader就是命令的請求者了,他是發出命令的人:

/**

* @auther: user

* @date: 2019/1/18 17:29

* 命令模式可以用於日誌和佇列中。

* @description:

*/public class remoteloader

}

整個命令模式到這邊就結束了。

命令模式可以用於佇列請求,日誌請求和實現撤銷操作等。佇列請求,想象乙個工作佇列,你在某一端新增命令,然後另一端則是執行緒,執行緒進行下面的動作:從佇列中取出乙個命令,呼叫它的execute方法,等待這個呼叫完成,然後將此命令物件丟棄,再取出下乙個命令。

記一下命令模式的要點:

1、命令模式將請求封裝成物件,這可以讓你使用不同的請求,佇列或者日誌請求來引數化奇特物件。

2、命令模式將發出請求的物件和執行請求的物件解耦。

3、在被解耦的兩者之間是通過命令物件進行溝通的,命令物件封裝了接收者和乙個或者一組動作。

4、呼叫者通過呼叫命令物件的execute()方法發出請求,這會使得接收者的動作會被呼叫。

5、呼叫者可以接受命令當作引數,公升值在執行時動態地進行。

6、實際操作時,很常見使用「聰明」命令物件,也就是直接實現了請求,而不是將工作委託給接收者。

Head First設計模式之工廠模式

定義了乙個建立物件的介面,但由子類決定要例項化的類是哪乙個.工廠方法讓類把例項化推遲到子類 1 抽象工廠角色 這是工廠方法模式的核心,它與應用程式無關。是具體工廠角色必須實現的介面或者必須繼承的父類。2 具體工廠角色 它含有和具體業務邏輯有關的 由應用程式呼叫以建立對應的具體產品的物件。3 抽象產品...

Head First設計模式之組合模式

將物件組合成樹形結構來表現 整體 部分 層次結構。組合能讓客戶以一致的方法處理個別物件以及組合物件。主要部分可以被一致對待問題.組合模式主要包含三個角色 2.composite 容器構件 容器節點包含子節點,其子節點可以是葉子節點,也可以是容器節點,它提供乙個集合用於儲存子節點,實現了在抽象構件中定...

Head First設計模式之工廠模式

定義了乙個建立物件的介面,但由子類決定要例項化的類是哪乙個.工廠方法讓類把例項化推遲到子類 1 抽象工廠角色 這是工廠方法模式的核心,它與應用程式無關。是具體工廠角色必須實現的介面或者必須繼承的父類。2 具體工廠角色 它含有和具體業務邏輯有關的 由應用程式呼叫以建立對應的具體產品的物件。3 抽象產品...