【发布时间】:2012-11-28 17:47:20
【问题描述】:
我一直在阅读书籍,试图了解聚合和组合的各个方面。但是,我发现聚合可以增强松散耦合,但也可以破坏封装。
增强松散耦合。
public class Car{
private Engine engine;
Car(Engine e){
this.engine=e;
}
}
上面的引擎类的任何实现都可以在创建时创建并推送到 Car 对象,并且由于 Engine 实例可以在没有汽车的情况下生存,因此它是一个完美的聚合示例。 (这个例子可能不是一个很好的现实例子,但我想我的观点)
现在客户端代码可以完全控制引擎对象,因此它可以更改传递给 Car 的引擎对象的少数状态,并且 Car 的实现会破坏封装,因为它的对象或状态(即 Engine)是 no more 在汽车中具有正确的完整性。
我的理解正确吗?
【问题讨论】:
-
这有点取决于封装,你不想改变对象的状态,而是想操作对象。所以使用引擎而不是 engine.setOn(boolean) 你有 engine.turnOn()。如果您只希望汽车能够在引擎上运行,那么在构造函数中您将克隆对象以限制访问。 this.engine = (Engine)e.clone();汽车上的其他操作可能是 removeEngine 然后您可以访问引擎但汽车不再有一个。
-
IMO,我认为客户端无法控制 Engine 对象。我想会有一个更高级别的类,称为 Manufacturer,它会创建正确的 Engine 对象并将其设置为特定 Car 对象的引擎。
-
我认为他指的是创建汽车的过程在不应该引用引擎时会引用引擎。
-
@Vaibhav,我同意一个设计合理的类应该像你说的那样,但是制造商在这种情况下成为客户,他可以在 Car 之后修改 Engine 对象的某些状态创建,然后汽车对象将呈现损坏。你不这么认为吗?
-
@BevynQ,然后我会想象整个 Engine 类是只读的。
标签: java encapsulation aggregation