码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式(八)面向对象设计原则之合成复用原则

时间:2018-03-08 17:18:31      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:理解   之间   customer   面向对象   继承复用   分享   严格   color   设计   

引用自:http://blog.csdn.net/lovelion  作者:刘伟

 

合成复用原则(Composite Reuse Principle, CRP):尽量使用对象组合,而不是继承来达到复用的目的。

 

合成复用原则就是在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象,使之成为新对象的一部分;

新对象通过委派调用已有对象的方法达到复用功能的目的。简言之:复用时要尽量使用组合/聚合关系(关联关系),少用继承

 

在面向对象设计中,可以通过两种方法在不同的环境中复用已有的设计和实现,即通过组合/聚合关系或通过继承,

首先应该考虑使用组合/聚合组合/聚合可以使系统更加灵活,降低类与类之间的耦合度,一个类的变化对其他类造成的影响相对较少;

其次才考虑继承,在使用继承时,需要严格遵循里氏代换原则,有效使用继承会有助于对问题的理解,降低复杂度,

滥用继承反而会增加系统构建和维护的难度以及系统的复杂度,因此需要慎重使用继承复用。

 

一般而言,如果两个类之间是“Has-A”的关系应使用组合或聚合,如果是“Is-A”关系可使用继承"Is-A"是严格的分类学意义上的定义,

意思是一个类是另一个类的"一种";而"Has-A"则不同,它表示某一个角色具有某一项责任

 

下面通过一个简单实例来加深对合成复用原则的理解:

技术分享图片

 

技术分享图片

 

在图2中,CustomerDAO和DBUtil之间的关系由继承关系变为关联关系,采用依赖注入的方式将DBUtil对象

注入到CustomerDAO中,可以使用构造注入,也可以使用Setter注入。如果需要对DBUtil的功能进行扩展,

可以通过其子类来实现,如通过子类OracleDBUtil来连接Oracle数据库。由于CustomerDAO针对DBUtil编程,

根据里氏代换原则,DBUtil子类的对象可以覆盖DBUtil对象,只需在CustomerDAO中注入子类对象即可使用子类

所扩展的方法。例如在CustomerDAO中注入OracleDBUtil对象,即可实现Oracle数据库连接,

原有代码无须进行修改,而且还可以很灵活地增加新的数据库连接方式。

 

设计模式(八)面向对象设计原则之合成复用原则

标签:理解   之间   customer   面向对象   继承复用   分享   严格   color   设计   

原文地址:https://www.cnblogs.com/fzxiaoyi/p/8528947.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!