2012-04-21 20 views
0

「高級別」組件是一個具有根據其他「低級別」組件定義的行爲的類。這個例子是Bulb類需要Socket類來實現它的LightOn()行爲。是不是所有的超類都是子類的高級組件?

並非所有的超類都是高級組件,並不是所有的子類都是低級組件。由於以下示例。

模板方法模式從頭第一個設計模式。

public abstract class CaffeineBeverage { 

    final void prepareRecipe() { 
     boilWater(); 
     brew(); 
     pourInCup(); 
     addCondiments(); 
    } 

    abstract void brew(); 

    abstract void addCondiments(); 

    void boilWater() { 
     System.out.println("Boiling water"); 
    } 

    void pourInCup() { 
     System.out.println("Pouring int cup"); 
    } 
} 

public class Coffee extends CaffeineBeverage { 

    public void brew() { 
     System.out.println("Dripping Coffee through filter"); 
    } 

    public void addCondiments() { 
     System.out.println("Adding Sugar and Milk"); 
    } 
} 

在這個例子中CaffeineBeverage類有一個行爲prepareRecipe()。此行爲需要brew()addCondiments()的子類實現。 (超類)是高層組件,而Coffee(子類)是低層組件。

public class superClass { 
    public go() { 
     //super class implementation 
    } 
} 

public class subClass extends superClass { 
    public go() { 
     //sub class implementation 
    } 
} 

在這種情況下superClass didnt需要subclass實施其go()方法。

即使一個類有抽象方法需要子類來實現它DOESNT意味着超類是高層組件。見下面的例子。

public abstract class superClass { 
    public abstract go(); 
} 

public class subClass extends superClass { 
    public go() { 
     //subclass implementation; 
    } 
} 

main() { 
    superClass s = new subClass(); 
    s.go(); 
} 

這裏s不是superClass對象... s這裏是subClass對象。

+2

您可能會將構圖與繼承混爲一談。燈泡不是插座。 – 2012-04-21 23:43:06

+0

呵呵???????????? – user1348869 2012-04-21 23:45:44

+0

但燈泡仍然需要插座具有其lightON行爲,因此燈泡爲高級組件和插座爲底層組件。那麼你的意思是這個「高級組件事物」只適用於繼承?對不起,我的英文順便說一句。 – user1348869 2012-04-21 23:50:37

回答

1

是不是所有的超類都是子類的高級組件?

是的這是正確的說......假設您正確地使用「組件」這個詞。事實上,作爲一般規則,繼承不會爲組件建模。

例如:

public abstract class Mammal extends Animal { 
     .... 
    } 

    public class Cat extends Mammal { 
     .... 
    } 

是貓不是哺乳動物「組件」,和哺乳動物是不是一個動物的「組件」。這不是對「構圖」或「容器」關係的建模。它正在建模一個分類關係;即貓「是」哺乳動物,哺乳動物「是」動物。


你的第一個例子有點混亂/困惑,因爲類名和方法有矛盾的含義(在我看來)。但它看起來像是在模擬飲料製作設備。如果這是正確的,那麼你真正建模的關係是「是 - 」而不是「/ - 部分」的「組成部分」。


最後,不要卡在與現實世界相關的「意味着什麼」類和繼承的觀點上。在實踐中,Java類是,很少用來直接建模真實世界的東西。 (你不可能在真正的程序中看到模仿貓和咖啡機的課程)。繼承的真正效用在於能夠爲代碼提供結構......不能(粗略地)模擬真實世界。

+0

在headfirst設計模式中,它解釋了A **高級組件是一個具有根據其他低級組件定義的行爲的類**,所以如果不是通過繼承而是通過組合,是具有行爲(方法)的對象根據對象直通組成來定義。這個對象是高層組件嗎? – user1348869 2012-04-22 01:06:01

+0

你在閱讀中犯了一個基本的邏輯錯誤。 「一個組件是一個類」並不意味着「一個類是一個組件」。 – 2012-04-22 02:34:08

相關問題