我一直在阅读书籍,试图理解聚合和组合的各个方面。但是我遇到了一个点,我觉得聚合可以增强松耦合,但也可以打破封装。
增强松散耦合。
public class Car{
private Engine engine;
Car(Engine e){
this.engine=e;
}
}
在上面,可以创建Engine类的任何实现,并在创建时将其推送到Car对象,并且由于Engine实例可以在没有car的情况下生存,因此它是聚合的完美示例。 (这个例子可能不是一个很好的现实世界的例子,但我认为我提出了我的观点)
现在客户端代码可以完全控制Engine对象,因此它可以改变传递给Car的引擎对象的几个状态,而Car的实现会打破封装,因为它的对象或状态(即Engine)是no更多在汽车中拥有正确的完整性。
我的理解是否正确?
答案 0 :(得分:1)
在这里,松散耦合的目标是Car&发动机。
虽然汽车通过其构造函数接受任何引擎,但我相信,汽车不会通过getter方法暴露引擎。
此构造函数应具有适当的访问控制/级别,并由工厂或其他创建模式使用,该模式负责将引擎与汽车集成。
允许Car的客户访问引擎应该通过Car的界面。
答案 1 :(得分:1)
Engine
只有在Car
可变的情况下才能被打破,即汽车可以改变引擎的状态。但是,您可以定义不可变类Engine
(仅具有访问状态的getter和不更改状态的业务方法)或创建由类Engine
实现的接口EngineImpl
。 EngineImpl
不是一成不变的。它包括可以改变其状态的功能。但是它实现了接口Engine
,它只向客户端公开“不可变”方法。因此,汽车无法更改隐藏在只读界面EngineImpl
后面的Engine
状态。在这种情况下,封装不会被破坏。
你是对的:这不是现实世界的例子:在现实世界中,驱动程序通过他的汽车提供的界面控制引擎并且可以打破引擎:(