2010-09-14 69 views
1

公共類Elevator() { Button firstFloorbutton = ButtonFactory.getButtonInstance(this,1); Button secondFloorbutton = ButtonFactory.getButtonInstance(this,2); Button thirdFloorbutton = ButtonFactory.getButtonInstance(this,3); 按鈕fourthFloorbutton = ButtonFactory.getButtonInstance(this,4);已有-A Relationship

Fan fan1 = FanFactory.getFanInstance(this); 

Light light1 = LightFactory.getInstance(this); 

private void goUp() 
{ 
    ..... 
} 

private void goDown() 
{ 
    ...... 
} 

    ............. 

} 

     ============================ 

public class Button() 
{ 

    Elevator E; 
    int floor; 

    public button (Elevator E, int floor) 
    { 
    this.E = E; 
    this.floor = floor; 
    } 

    public void buttonPressed() 
    { 

    //logic to determine which floor the elevator is currently at and determine whether to go up or down to reach "this.floor" 

    E.goUp(); // if need to go up 

    else 

    E.goDown() // if need to go down 

    } 
} 


    ========================== 


    public class ButtonFactory() 
    { 

     public Button getButtonInstance(Elevator E, int floor) 
     { 
     Button b =new Button(E, floor); 
     return b; 
     } 
    } 

    ================== 

    public class FanFactory(){ .................} 

    ===================== 

    public class LightFactory() { ........... } 


    ========================== 

電梯和按鈕類之間存在什麼樣的關係?

根據凱西和伯特(SCJP)第92頁:HAS-A關係是基於使用而不是繼承。換句話說,如果A類中的代碼具有對B類實例的引用,則A類HAS-A B有參考。

在我的示例中,Elevator類代碼具有對Button實例的引用,Button具有對實例的引用電梯類。

任何人都可以請澄清這一點。

回答

3

電梯有一個按鈕。實際上,它有四個,但每個按鈕都有一個關係。

has-a是一個有點非正式的術語,用於指代兩種更正式的關係:關聯和聚合。在這兩種情況下,關係中的一方都有一個指向另一方的指針,但它們通過語義區分:在一個關聯關係中,第一方知道另一方,但並不完全支配它(想想你和一個同事,或者老闆,或者下屬),而在聚合關係中,後者是前黨的一部分,並且沒有獨立存在(認爲你和你的肝臟)。在這種情況下,我會說Button更具體地是與電梯的聚合關係的從屬端,而不僅僅是關聯關係。

關聯的其他示例可能是客戶和推銷員,或部門和員工。聚合,訂單和訂單行,或結構和組件。有趣的角落案例是類別和產品,以及訂單和發票。

這種關係的一個實際結果是對象的生命週期:在一個關聯中,如果第一個對象死了,第二個對象可能存活,但是在一個聚合中它會死亡。考慮一下你的電梯:如果你刪除了一個(或者從你的實時數據結構中刪除它,至少讓它被垃圾收集),你想讓按鈕生存嗎?

+0

很好的解釋湯姆。謝謝。 – AKh 2010-09-14 21:20:25

0

這是一種Has-A關係,它是記憶組合模型的一種簡單方法。 Button類由Elevator類組成;即Button類有一個Elevator類。