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类实例的引用。
任何人都可以澄清一下。
答案 0 :(得分:3)
电梯有一个按钮。实际上,它有四个,但每个按钮都有一个关系。
Has-a是一个有点非正式的术语,用于指两种更正式的关系:关联和聚合。在这两种情况下,关系中的一方都有指向另一方的指针,但它们通过语义来区分:在关联关系中,第一方知道另一方,但并不完全支配它(想想你和同事)或者是老板,或者是下属),而在聚合关系中,后者是前一方的一部分,并且没有独立存在(想想你和你的肝脏)。在这种情况下,我会说Button更具体地说是与Elevator的聚合关系的从属端,而不仅仅是关联关系。
其他关联示例可能是客户和销售员,或部门和员工。聚合,Order和OrderLine,或结构和组件。有趣的角落案例是类别和产品,订单和发票。
这种关系的一个实际结果是对象生命周期:在关联中,如果第一个对象死亡,第二个对象可能存活,但在聚合中,它将死亡。想想你的电梯:如果你删除了一个(或者从你的实时数据结构中删除它并至少让它被垃圾收集),你想让按钮存活吗?
答案 1 :(得分:0)
这是一种Has-A关系,这是记住合成模型的简单方法。 Button类由Elevator类组成;即Button类有一个Elevator类。