聚合中断封装



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

增强松耦合。

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

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

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

我的理解正确吗?

只有当Engine是可变的时,才能被Car打破,即汽车可以改变发动机的状态。但是,您可以定义不可变的类Engine(只有getter来访问不更改状态的状态和业务方法),也可以创建由类EngineImpl实现的接口EngineEngineImpl不是一成不变的。它包括可以更改其状态的功能。但是,它实现了接口Engine,仅向客户端公开"不可变"方法。因此,汽车无法改变隐藏在只读界面后面EngineImpl Engine的状态。在这种情况下,封装不会中断。

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

在这里,松耦合的目标是汽车和发动机之间的关系。

虽然汽车通过

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

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

允许汽车的客户端访问引擎应该通过汽车的界面。

最新更新