|
本帖最后由 惜 于 2018-12-21 14:08 编辑
五 、 合成/ 聚合复用原则 (CARP )
合成/聚合复用原则(Composite/Aggregate Reuse Principle 或 CARP)经常又叫做合成复用原则
(Composite Reuse Principle 或 CRP),就是在一个新的对象里面使用一些已有的对象,使之成为新对象的
一部分;新对象通过向这些对象的委派达到复用已有功能的目的。
简而言之,要尽量使用合成/聚合,尽量不要使用继承。
o Design to interfaces.
o Favor composition over inheritance.
o Find what varies and encapsulate it.(摘自:Design Patterns Explained)
区分"Has-A"与"Is-A"
"Is-A"是严格的分类学意义上定义,意思是一个类是另一个类的"一种"。而"Has-A"则不同,它表示某一个角色
具有某一项责任。
导致错误的使用继承而不是合成/聚合的一个常见的原因是错误的把"Has-A"当作"Is-A"。例如:
实际上,雇员、经理、学生描述的是一种角色,比如一个人是"经理"必然是"雇员",另外一个人可能是"学生雇
员",在上面的设计中,一个人无法同时拥有多个角色,是"雇员"就不能再是"学生"了,这显然是不合理的。
错误源于把"角色"的等级结构与"人"的等级结构混淆起来,误把"Has-A"当作"Is-A"。解决办法:
延伸阅读:来自阿里云
IS-A、HAS-A和USE-A都是用来表示类与类之间的关系的,其中IS-A表示继承,HAS-A表示组合,USE-A表示依赖。
IS-A表示类与类之间的继承关系,在iOS中,你要实现一个控制器,通常是继承与UIViewController的,你自己的控制器和UIViewController之间的关系就是IS-A系。
HAS-A表示组合关系,是整体和部分之间的关系,同时整体必须负责销毁部分,你的控制器里有很多View,控制器与View之间的关系就是HAS-A关系。USE-A表示依
IS-A、HAS-A和USE-A都是用来表示类与类之间的关系的,其中IS-A表示继承,HAS-A表示组合,USE-A表示依赖。
IS-A表示类与类之间的继承关系,在iOS中,你要实现一个控制器,通常是继承与UIViewController的,你自己的控制器和UIViewController之间的关系就是IS-A关系。
HAS-A表示组合关系,是整体和部分之间的关系,同时 整体必须负责销毁部分,你的控制器里有很多View,控制器与View之间的关系就是HAS-A关系。
USE-A表示依赖关系,是类与类之间的连接,依然是其中一个拥有另外一个,但是却 不负责销毁它。 我个人认为代理模式应该就属于USE-A关系 。
|
|