2010-11-09 126 views
3

在大多數設計模式概念中,有人提到「有A」比「是A」更好。需要說明 - 設計模式

在第一章 - Head First設計模式 - 「簡介設計模式」,部分「集成鴨子行爲」(第15號),鴨類具有FlyBehavior和QuackBehavior接口類型的引用。例如,我們將添加一個新特性名稱爲XYZBehavior(假設客戶端尚未確定它)的新行爲,我們需要更改Duck類以引用新接口。因此,我們需要改變班級,但不應按照良好的設計模式進行。

你能告訴我怎麼處理這個要求?

+0

對不起添加來自Head First設計模式所採取的例子... – Famn 2010-11-09 10:46:35

+3

你能爲我們這些沒有這本書誰提供一個代碼示例? – 2010-11-09 10:47:02

回答

0

如果您添加新行爲(策略),則策略模式不會阻止更改類。如果現有行爲(策略)發生變化,它只是防止觸摸該類。我們認爲,鴨子會聽起來像「叮叮噹噹」,但經過多年的研究,我們意識到,鴨子聽起來像是「quaack」。我們很幸運,我們實施了一個QuackBehaviour,並且調整了Common鴨子的QuackBehaviour接口的實現。這是這種模式的訣竅。

如果後面的話,我們決定添加一個SwimBehaviour,因爲另一個研究小組認識到,游泳是一種常見的鴨子行爲,那麼我們必須觸摸常見的鴨子並添加該行爲(到Duck課程)。

希望它有幫助!

+0

很好的解釋。非常感謝你。 – Famn 2010-11-11 05:44:16

1

這個問題可以通過使用Dependency Injection

(在Java中通常是通過兩種SpringGuice

這裏要解決的一個Beginner's Guide to dependency Injection

基本上,鳥將有一個行爲屬性:

private Collection<Behavior> behaviors; 
public void setBehaviors(Collection<Behavior> behaviors){ 
    this.behaviors = behaviors; 
} 

現在在配置文件中,您可以指定哪個B行爲會被注入到鳥類中,而不必改變鳥類。

+0

很好的例子。非常感謝你 – Famn 2010-11-09 10:58:05

0

您可以通過使用Composition =>Duck有一個列表Behaviours來處理這種情況。

Duck將維護行爲對象的列表。在創建Duck對象時填充相關行爲。

示例代碼:

import java.util.*; 

interface Behaviour{ 

} 
class FlyBehaviour implements Behaviour{ 

} 
class QuackBehaviour implements Behaviour{ 

} 
class XYZBehaviour implements Behaviour{ 

} 

public class Duck{ 
    private List<Behaviour> duckBehaviours = new ArrayList<Behaviour>(); 

    public Duck(List<Behaviour> list){ 
     duckBehaviours = list; 
    } 
    public static void main(String[] args){ 
     // set the behaviours 
     List<Behaviour> list = new ArrayList<Behaviour>(); 
     list.add(new FlyBehaviour()); 
     list.add(new QuackBehaviour()); 
     list.add(new XYZBehaviour()); 
     Duck duck = new Duck(list); 
    } 
}