对象相识

时间:2014-10-07 19:37:01

标签: java c++ design-patterns

我目前正在阅读四人一组的“设计模式”一书。在某一时刻比较运行时和编译时结构。在本节中,将编写以下内容:

  

聚合意味着一个对象拥有或负责另一个对象。通常我们说的是拥有 另一个对象的一部分。聚合意味着聚合对象及其所有者具有相同的生命周期。

我对此的解释类似于Java中的以下内容:

public class SomeClass{
    private OtherClass; //This is the aggregate object
    //...
}

我认为这就是他们的意思,我发现这很容易理解。但他们定义了一个熟人:

  

熟人意味着一个对象只是知道另一个对象。有时   熟人被称为"协会"或者"使用"关系。熟悉   对象可以请求彼此的操作,但他们不负责   彼此。熟人是一种比聚合更弱的关系,并暗示   对象之间更松散的耦合。 ...在C ++中,可以通过定义作为实例的成员变量来实现聚合,但将它们定义为指针或对实例的引用更为常见。 Aquaintance也使用指针和引用实现。

最后一点让我困惑。它只能通过指针实现吗?他们特意谈论C ++,这是否意味着它无法用Java实现?根据我的理解,在Java中,熟悉的关系将是这样的:

public class SomeClass{
    ///...

    public void doSomething(SomeOtherClass some_other_class){
        some_other_class.doSomethingElse(); //Is this (an) aquaintance?
    }

    ///...
}

我不完全确定我的这个(水上运动)概念已经失效了。如果这是在Java中查看事物的正确方法,是否有人愿意启发我?或者可以用Java实现友好关系,因为我们没有指针?

最后他们说:

  

最终,熟人和聚合更多地是通过意图来决定的   明确的语言机制。

那是什么意思?它们只是抽象的概念,而不是实际的实现或什么?

Difference aggregation, acquaintance and composition (as used by Gang Of Four)。这是我能找到的唯一一个接近我自己的问题,但它并没有给我带来太多帮助。提前谢谢。

2 个答案:

答案 0 :(得分:3)

我认为你完全理解一切。熟悉的关系可以像Java一样在Java中实现。 (Java确实有指针; Java引用只是比C指针更高级别的抽象)

public class SomeClass{
///...

    public void doSomething(SomeOtherClass some_other_class){
        some_other_class.doSomethingElse(); //yes SomeOtherClass is the Acquaintance
    }

///...
}

GoF书是在Java发布之前编写的,因此它使用的C ++术语和概念可能与Java 100%匹配,也可能不与Java匹配。

熟人一词可能意味着与C ++的Friend概念关系不那么密切,因为{{3}}可以看到和访问另一个对象&#39}私人数据

答案 1 :(得分:1)

  

聚合意味着聚合对象及其所有者拥有   相同的生命周期。

我不同意这句话,其余的我会尝试解释差异并举例说明。


熟人,聚合和构图是建模概念:我的意思是它们不是编程技术,也不是与代码相关的东西,而是一种从你正在看的世界制定方案的方法。

相识示例:您拥有个人计算机和屏幕,屏幕不是PC的一部分,也不是屏幕的PC部分,但它们都可以一起工作。

聚合示例:汽车有发动机,车轮和车灯。发动机是汽车的一部分,汽车是用发动机制造的。但如果从汽车上拆下发动机,汽车仍然存在。

组成:也称为" hard"聚合:足球队由球员组成,球员是足球队的一员。如果你删除了团队中的所有玩家......那么它还不是一个团队。

所有这些:熟人/分离,构图和聚合是概念,它们取决于你如何看待世界,分离有时不是很清楚。在大多数情况下,更多的是关于什么对您/您的软件很重要。

有常见的"在Java和C ++上实现所有这些的方法(你可以很容易地找到它们),但同样重要的是:这里的概念很重要,而不是代码。