在大多數設計模式概念中,有人提到「有A」比「是A」更好。需要說明 - 設計模式
在第一章 - Head First設計模式 - 「簡介設計模式」,部分「集成鴨子行爲」(第15號),鴨類具有FlyBehavior和QuackBehavior接口類型的引用。例如,我們將添加一個新特性名稱爲XYZBehavior(假設客戶端尚未確定它)的新行爲,我們需要更改Duck類以引用新接口。因此,我們需要改變班級,但不應按照良好的設計模式進行。
你能告訴我怎麼處理這個要求?
在大多數設計模式概念中,有人提到「有A」比「是A」更好。需要說明 - 設計模式
在第一章 - Head First設計模式 - 「簡介設計模式」,部分「集成鴨子行爲」(第15號),鴨類具有FlyBehavior和QuackBehavior接口類型的引用。例如,我們將添加一個新特性名稱爲XYZBehavior(假設客戶端尚未確定它)的新行爲,我們需要更改Duck類以引用新接口。因此,我們需要改變班級,但不應按照良好的設計模式進行。
你能告訴我怎麼處理這個要求?
如果您添加新行爲(策略),則策略模式不會阻止更改類。如果現有行爲(策略)發生變化,它只是防止觸摸該類。我們認爲,鴨子會聽起來像「叮叮噹噹」,但經過多年的研究,我們意識到,鴨子聽起來像是「quaack」。我們很幸運,我們實施了一個QuackBehaviour,並且調整了Common鴨子的QuackBehaviour接口的實現。這是這種模式的訣竅。
如果後面的話,我們決定添加一個SwimBehaviour,因爲另一個研究小組認識到,游泳是一種常見的鴨子行爲,那麼我們必須觸摸常見的鴨子並添加該行爲(到Duck
課程)。
希望它有幫助!
很好的解釋。非常感謝你。 – Famn 2010-11-11 05:44:16
這個問題可以通過使用Dependency Injection
這裏要解決的一個Beginner's Guide to dependency Injection
基本上,鳥將有一個行爲屬性:
private Collection<Behavior> behaviors;
public void setBehaviors(Collection<Behavior> behaviors){
this.behaviors = behaviors;
}
現在在配置文件中,您可以指定哪個B行爲會被注入到鳥類中,而不必改變鳥類。
很好的例子。非常感謝你 – Famn 2010-11-09 10:58:05
您可以通過使用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);
}
}
對不起添加來自Head First設計模式所採取的例子... – Famn 2010-11-09 10:46:35
你能爲我們這些沒有這本書誰提供一個代碼示例? – 2010-11-09 10:47:02