复用机制与委托
类继承与接口继承有什么区别?
- 类继承: 子类复用父类的接口与实现;
- 接口继承: 只复用方法签名, 实现逻辑由实现类自己给出;
白箱复用与黑箱复用有什么区别?
- 白箱复用: 通过类继承复用, 父类实现对子类可见, 子类可改写父类行为;
- 黑箱复用: 通过组合复用, 被组合对象成为当前对象的一个属性, 内部细节不可见;
- 差别: 白箱复用依赖父类实现细节, 耦合更紧; 黑箱复用只依赖被组合对象的接口;
委托如何实现复用?
- 委托: 一种组合方法, 使组合具备与继承相同的复用能力;
- 做法: 额外创建一个对象充当被复用逻辑的代理者, 组合对象把请求转发给它;
- 边界: 组合对象只调用代理者的接口, 不依赖代理者内部实现;
三种复用方式如何对比?
| 维度 | 类继承 | 接口实现 | 委托 |
|---|---|---|---|
| 复用内容 | 接口 + 实现 | 仅接口 | 接口 + 实现 |
| 可见性 | 父类实现可见 | 无实现可复用 | 实现被封装 |
| 复用粒度 | 类型维度 | 类型维度 | 按行为自由组合 |
| 组合能力 | 单一父类 | 可多接口 | 可委托多个对象 |
- 结论: 需要复用实现又不愿暴露实现细节时, 用接口声明能力、用委托提供实现;