2

我一直在阅读书籍,试图了解聚合和组合的各个方面。但是我遇到了一点,我觉得聚合可以增强松散耦合,但也可以破坏封装。

增强松耦合。

public class Car{
    private Engine engine;
    Car(Engine e){
        this.engine=e;
    }
}

在上面,引擎类的任何实现都可以在创建时创建并推送到 Car 对象,并且由于 Engine 实例可以在没有汽车的情况下存在,因此它是一个完美的聚合示例。(这个例子可能不是一个很好的现实例子,但我想我的观点)

现在客户端代码完全控制了引擎对象,因此它可以更改传递给汽车的引擎对象的少数状态,并且汽车的实现会破坏封装,因为它的对象或状态(即引擎)不再具有汽车中的正确完整性。

我的理解正确吗?

4

2 回答 2

1

在这里,松耦合针对的是 Car 和 Engine 之间的关系。

尽管汽车通过其构造函数接受任何引擎,但我相信汽车不会通过 getter 方法暴露引擎。

该构造函数应该具有适当的访问控制/级别,并由工厂或其他负责将引擎与汽车集成的创建模式使用。

允许 Car 的客户端访问 Engine 应该是通过 Car 的接口。

于 2012-12-11T07:56:49.217 回答
1

只有当它是可变的时Engine才能被打破Car,即汽车可以改变引擎的状态。但是,您可以定义不可变类Engine(仅具有访问状态的 getter 和不更改状态的业务方法)或创建Engine由 class 实现的接口EngineImplEngineImpl不是一成不变的。它包括可以更改其状态的功能。然而,它实现Engine了只向客户端公开“不可变”方法的接口。所以,汽车不能改变EngineImpl隐藏在只读界面后面的状态Engine。在这种情况下,封装不会被破坏。

你是对的:这不是现实世界的例子:在现实世界中,驾驶员通过他的汽车提供的接口控制引擎并且可以破坏引擎:(

于 2012-12-11T07:58:15.177 回答