我目前正在阅读四人一组的“设计模式”一书。在某一时刻比较运行时和编译时结构。在本节中,将编写以下内容:
聚合意味着一个对象拥有或负责另一个对象。通常我们说的是拥有或 另一个对象的一部分。聚合意味着聚合对象及其所有者具有相同的生命周期。
我对此的解释类似于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)。这是我能找到的唯一一个接近我自己的问题,但它并没有给我带来太多帮助。提前谢谢。
答案 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 ++上实现所有这些的方法(你可以很容易地找到它们),但同样重要的是:这里的概念很重要,而不是代码。