Java与模式第十章读书笔记

-## 合成/聚合复用原则

  • 概念:合成/聚合复用原则又叫做合成复用原则,就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分。

  • 在开发过程中尽量使用合成/聚合,尽量不要使用继承。(下面会讲)

  1. 合成聚合的区别:二者均是关联关系,但是聚合用来表示“拥有”关系或者整体与部分的关系,而合成是一种强的多的“拥有”。在合成中,整体与部分的生命周期是一样的,一个合成关系中的成分对象是不能和另外一个合成关系对象共享的。

  2. 复用的基本类型
    合成/聚合复用:
    优点:新对象调用成分对象的唯一方法就是调用接口,所以是看不到内部细节的,称为黑箱复用。这种复用支付包装,依赖较少,可以动态进行。
    缺点:需要管理较多生产的新对象
    继承复用:
    值Java类中从一个类到另一个类的实现性继承,就是俗称的实现继承,不是接口继承
    优点:实现较为容易,超类大部分功能可以通过继承进入子类,且修改或拓展继承实现较为容易
    缺点:破坏包装,超类内部细节对子类是透明的,成为白箱复用。如果超类发生改变,子类也必须改变。从超类继承的实现是静态的,不可能在运行时间内发生改变,没有足够灵活性。

  3. 从代码的角度理解区分
    has-a 和is-a :is-a是一个类是另一个类的一种,has-a是某一个角色具有某一项责任。
    请考虑一下下图所示的类图中所描述的例子。“人”被继承到“雇员”“经理”和“学生”等子类。而实际上,“雇员”、“经理”和“学生”分别描述一种角色,而“人”可以同时有几种不同的角色。比如,一个“人”既然是“经理”,就必然是“雇员”;而此“人”同时有几种不同的角色。比如,一个“人”既然是“经理”,就必然是“雇员”;而此“人”同时有几种不同的角色。比如,一个“人”既然是“经理”,就必然是“雇员”;而此“人”份后,就永远为“雇员”,不能称为“经理”或“学生”,而这显然是不合理的。Java与模式第十章读书笔记
    这一错误的设计源自于把“角色”的等级结构与“人”的等级结构混淆起来,把Has-A角色误解为Is-A 角色。因此要纠正这- -错误,关键是区分“人”与“角色”的区别。下图所示的设计就正确地做到了这一点。
    Java与模式第十章读书笔记
    从上图可以看出,每一个“人”都可以有一个以上的“角色”,所以一个人可以同时从上图可以看出,每一个“人”都可以有一个以上的“角色”,所以一个人可以同时通过合成的,因此,角色可以有动态的变化。–个 “人”可以开始是一个“雇员”,然后晋升为“经理”,然后又由于他参加了MBA课程,又成为了“学生”。这就是说,当一个类是另-一个类的角色时,不应当使用继承描述这种关系。(这一段摘抄自原文【Java与模式】)

  4. 只有两个类满足里氏代换原则,才有可能是is-a关系