关于“优先组合而不是继承”的问题,我的老师是这样说的:
这三个概念我不是很了解,所以尝试写下一些代码:
//Composition is this
Class A{
public void doSomething(){
//do some code
}
}
Class B{
A a = new A();
public void doOther(){
a.doSomething(); //this is forwarding
}
}
那么什么是包装呢?
最佳答案
你的第一个例子不是组合。
Composition是 2 个对象之间的“has-a”关系,其中一个对象(组合对象)是另一个(所有者)的字段成员。
组成将是:
class DemoA {
DemoB b; //composition
}
我们会说“DemoA 由 DemoB 组成”。
如果
DemoB
对象在 DemoA
时仍然可用变得不可达,我们考虑 DemoB
成为 aggregated .例如,尽管 key 环可能已被破坏,但仍然可以使用 key 。 key 环将由 key 组成,但不拥有它们,这表示聚合。您的转发示例看起来不错,尽管要求确实说“返回结果”,这可能表明方法不应为空:
class DemoA {
private DemoB b;
public int doSomething() {
return b.doSomething(); //forwarding/delegating
}
}
至于包装器,它们封装了对象的行为,暴露了新的(通常是更复杂的)行为。一个例子是
DataInputStream
,它包装了一个 InputStream
让您阅读String
对象和更多,当 InputStream
只能处理原始数据。class DemoB {
public int read() {
//...Read one int of data
}
}
class DemoA {
private DemoB b;
public DemoA(DemoB b) {
this.b = b;
}
public List<Integer> readUntil(List<Integer> dataList, Supplier<Boolean> condition) {
while(condition.get())
dataList.add(b.read());
return dataList;
}
}
在本例中,
DemoA
包裹 DemoB
揭露readUntil
行为,某事 DemoB
做不到。这是一个有点愚蠢的例子,但希望能表达出这一点:我们的
DemoB
object 不能执行我们需要的行为 (readUntil),因此我们将其包装在为我们处理行为的类型中,因此我们不会不断重写此类行为。
关于java - 组合、转发和包装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42029992/