有关系

时间:2010-09-14 20:16:03

标签: analysis composition aggregation associations

公共类电梯()     {      Button firstFloorbutton = ButtonFactory.getButtonInstance(this,1);      Button secondFloorbutton = ButtonFactory.getButtonInstance(this,2);      Button thirdFloorbutton = ButtonFactory.getButtonInstance(this,3);      Button fourthFloorbutton = ButtonFactory.getButtonInstance(this,4);

 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() { ........... }


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

Elevator和Button类之间存在什么样的关系?

根据 Kathy和Bert(SCJP)第92页:HAS-A关系基于使用而不是继承。换句话说,如果A类中的代码具有对B类实例的引用,则为A类HAS-A B.

在我的示例中,Elevator类代码具有对Button实例的引用,Button具有对Elevator类实例的引用。

任何人都可以澄清一下。

2 个答案:

答案 0 :(得分:3)

电梯有一个按钮。实际上,它有四个,但每个按钮都有一个关系。

Has-a是一个有点非正式的术语,用于指两种更正式的关系:关联和聚合。在这两种情况下,关系中的一方都有指向另一方的指针,但它们通过语义来区分:在关联关系中,第一方知道另一方,但并不完全支配它(想想你和同事)或者是老板,或者是下属),而在聚合关系中,后者是前一方的一部分,并且没有独立存在(想想你和你的肝脏)。在这种情况下,我会说Button更具体地说是与Elevator的聚合关系的从属端,而不仅仅是关联关系。

其他关联示例可能是客户和销售员,或部门和员工。聚合,Order和OrderLine,或结构和组件。有趣的角落案例是类别和产品,订单和发票。

这种关系的一个实际结果是对象生命周期:在关联中,如果第一个对象死亡,第二个对象可能存活,但在聚合中,它将死亡。想想你的电梯:如果你删除了一个(或者从你的实时数据结构中删除它并至少让它被垃圾收集),你想让按钮存活吗?

答案 1 :(得分:0)

这是一种Has-A关系,这是记住合成模型的简单方法。 Button类由Elevator类组成;即Button类有一个Elevator类。