2014-01-30 230 views

回答

3

當策略類具有上下文知識時,或者當客戶意識到策略具體類時,策略是耦合的。

我們可以讀到here(有一些小修改):

通常每個策略從上下文需要的數據還是有一些處理的數據返回上下文。這可以通過兩種方式來實現。

  1. 創建一些額外的類來封裝特定的數據。
  2. 將上下文對象本身傳遞給策略對象。策略對象可以直接在上下文中設置返回的數據。

當應該傳遞數據時,應該分析每種方法的缺點。例如,如果創建了一些類來封裝其他數據,則應特別注意類中包含哪些字段 。也許在當前的實現中,所有的 必填字段都會被添加,但是將來可能會有一些新的策略 具體類需要來自上下文的數據,這些數據不包含在 附加的類中。另一個事實應該在此指定: 很有可能某些策略具體類不會使用 在附加類中傳遞給它的字段。

如果上下文對象被傳遞給策略,那麼我們在策略和上下文之間有一個耦合。

關於戰略和客戶端之間的耦合,在同一頁中,我們讀到:

在經典的實現模式的客戶端應該 意識到戰略的具體類。爲了將 客戶端類與策略類分離,可以使用上下文對象內的工廠類 來創建要使用的策略對象。通過 這樣做,客戶端只需發送參數(如字符串)到 上下文要求使用特定算法,完全是 策略類的解耦。

不管上下文是誰決定的策略,去耦是由注射的具體戰略目標,以客戶端,因此客戶端不知道它是具體的實施,還是什麼其他的實現也有。

因此,一個解耦的實現是沒有人知道其他具體參與者的地方。