Fra*_* Q. 18 delegation composition
在实施方面,组合设计与授权的区别是否有所不同.例如,下面的代码似乎正在进行委托,因为用户无法在不使用b的情况下访问组合对象(即"a").因此,用户需要调用类b的接口,然后"class b"调用"class a"的适当接口,使其成为委托.这有意义吗?
Class A {
friend class B;
private:
A(){}; //dont want user to instantiate this class object since it wont sense without any context. Just like a room with no house.
void PrintStructure(){};
};
Class B{
public:
void PrintStructure(){a.PrintStructure();} //delegate
private:
A a; //composition
};
Run Code Online (Sandbox Code Playgroud)
cle*_*tus 38
术语"组合"通常在对象建模方面用作"has-a"关系的表达,并且是关联形式(另一种是聚合).这通常与"继承"("is-a"关系)形成对比.所以:
组合和聚合之间有什么区别?组合意味着没有父母的上下文,孩子就不能存在.
例如,House有一个或多个房间.这是一种构图关系.删除房子,房间也不复存在.众议院也有许多人,是人的实例.这是一种聚合关系,因为那些人存在于该房子的背景之外.
授权只不过是一个实现细节.类具有描述其状态和行为的公共接口.如何实施是无关紧要的.它可以委托给其他对象.
您会注意到示例中的A和B都具有相同的外部接口.做这样的事情更常见:
// this represents an interface
class A {
public:
virtual void printStructure() = 0;
}
Run Code Online (Sandbox Code Playgroud)
具体课程:
class ConcreteA : A {
public:
virtual void printStructure() { ... }
}
Run Code Online (Sandbox Code Playgroud)
和
class DelegateA : A {
public:
DelegateA(A& a) { this.a = a; }
virtual void printStructure() { a.printStructure(); }
private:
A a;
}
Run Code Online (Sandbox Code Playgroud)
请原谅我可能的C++语法错误.我有点生疏了.
我看到了一些不同之处:
您展示的代码使用委托和关联; 关联可能是组合,但如果没有更广泛的背景或关于对象的更多信息(当关联成为一个组合时,它可能非常微妙和主观),很难说.
构图是关于对象之间的关系。
委派是将工作从一个对象传递到另一个对象。
这些实际上是不同的(但有时相关的)问题。
你得到的是由A组成的B(B指的是A)。B 还将其一个方法委托给 A。
但由于 B 对 A 的使用是私有的(完全封装在 B 的黑匣子内),所以我不会将 B 对 A 的使用称为“组合”。仅当类 A 可以从 B 访问时,我才会使用“组合”。这里重要的是 B 的逻辑模型是否“有一个”A。
在您的例子中,B 是根据 A 实现的。由于这是一个实现问题,因此可以将其视为不是 B 逻辑模型的一部分。也就是说,你可以明智地谈论 B,而不谈论或关心 A。
总而言之,这些东西实际上只对 PHB 和 UML 建模工具重要。或者如果您正在学习设计模式。我不会太沉迷于此。
[PHB => 尖头发的老板]
| 归档时间: |
|
| 查看次数: |
14293 次 |
| 最近记录: |