2010-09-14 63 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类。