合成复用原则
来源:互联网 发布:微信交友源码 编辑:程序博客网 时间:2024/05/19 09:15
合成复用原则又称为组合/聚合复用原则(Composition/Aggregate Reuse Principle, CARP),其定义如下:
合成复用原则(Composite Reuse Principle, CRP):尽量使用对象组合,而不是继承来达到复用的目的。
合成复用原则就是在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象,使之成为新对象的一部分;新对象通过委派调用已有对象的方法达到复用功能的目的。简言之:复用时要尽量使用组合/聚合关系(关联关系),少用继承。在面向对象设计中,可以通过两种方法在不同的环境中复用已有的设计和实现:
1、通过组合/聚合关系(首先考虑)
2、通过继承
组合/聚合优缺点:
优点:
由于组合或聚合关系可以将已有的对象(也可称为成员对象)纳入到新对象中,使之成为新对象的一部分,因此新对象可以调用已有对象的功能,这样做可以使得成员对象的内部实现细节对于新对象不可见,所以这种复用又称为“黑箱”复用,相对继承关系而言,其耦合度相对较低,成员对象的变化对新对象的影响不大,可以在新对象中根据实际需要有选择性地调用成员对象的操作。合成复用可以在运行时动态进行,新对象可以动态地引用与成员对象类型相同的其他对象。缺点:
通过这种方式复用建造的系统会有较多的对象需要管理继承优缺点:
优点:
新的实现较为容易,因为基类的大部分功能可以通过继承关系自动进入派生类,修改或扩展继承而来的实现较为容易。有效使用继承会有助于对问题的理解,降低复杂度。滥用继承反而会增加系统构建和维护的难度以及系统的复杂度,因此需要慎重使用继承复用。缺点:
通过继承来进行复用的主要问题在于继承复用会破坏系统的封装性,因为继承会将基类的实现细节暴露给子类,由于基类的内部细节通常对子类来说是可见的,所以这种复用又称“白箱”复用,如果基类发生改变,那么子类的实现也不得不发生改变;从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性。选择原则:
1、一般而言,如果两个类之间是“Has-A”的关系应使用组合或聚合,如果是“Is-A”关系可使用继承。"Is-A"是严格的分类学意义上的定义,意思是一个类是另一个类的"一种";而"Has-A"则不同,它表示某一个角色具有某一项责任。2、永远不会出现需要将子类换成另一个类的子类的情况,也就是说,一个子类所继承的基类是固定的,所谓的固定是指以后不会换成继承别的基类。
在使用继承时,需要严格遵循里氏代换原则,有效使用继承会有助于对问题的理解,降低复杂度,而滥用继承反而会增加系统构建和维护的难度以及系统的复杂度,因此需要慎重使用继承复用。下面通过一个简单实例来加深对合成复用原则的理解:3、子类应具有扩展父类的责任,而不仅是重写(Override)或注销掉(使某些方法失效)父类的行为,如果子类需要大量重写父类的行为,那么这个子类不应当成为这个父类的子类。
4、只有在分类学角度上有意义,才可以使用继承,不要继承工具类。
使用:
Sunny软件公司开发人员在初期的CRM系统设计中,考虑到客户数量不多,系统采用MySQL作为数据库,与数据库操作有关的类如CustomerDAO类等都需要连接数据库,连接数据库的方法getConnection()封装在DBUtil类中,由于需要重用DBUtil类的getConnection()方法,设计人员将CustomerDAO作为DBUtil类的子类,初始设计方案结构如下图所示:
随着客户数量的增加,系统决定升级为Oracle数据库,因此需要增加一个新的OracleDBUtil类来连接Oracle数据库,由于在初始设计方案中CustomerDAO和DBUtil之间是继承关系,因此在更换数据库连接方式时需要修改CustomerDAO类的源代码,将CustomerDAO作为OracleDBUtil的子类,这将违反开闭原则。【当然也可以修改DBUtil类的源代码,同样会违反开闭原则。】
根据合成复用原则,我们在实现复用时应该多用关联,少用继承。因此在本实例中我们可以使用关联复用来取代继承复用,重构后的结构如图所示:
0 0
- 合成复用原则
- 合成复用原则
- 合成复用原则
- 合成复用原则
- 合成/聚合复用原则
- 合成/聚合复用原则
- 合成聚合复用原则
- 合成/聚合复用原则
- 合成/聚合复用原则
- 合成、聚合复用原则
- 合成/聚合复用原则
- 合成复用原则(C++)
- 合成聚合复用原则(CARP)
- 合成/聚合复用原则(CARP)
- 合成/聚合复用原则CARP
- 合成/聚合复用原则(CARP)
- 【设计模式】合成复用原则
- 设计模式系列:合成复用原则
- Android嵌套滑动组件相关的文章资料
- C# 微信接口之推送模版消息
- hdu5373 The shortest problem(迭代模拟+同余定理)
- Poj 1789 Truck History【最小生成树】
- centos配置nfs服务详细步骤(centos开启nfs服务)
- 合成复用原则
- NSIS 自定义安装界面准确获取安装进度完美解决方案
- Java ClassLoader基础及加载不同依赖 Jar 中的公共类
- html5 表单
- 黑马程序员----------------java基础-----------------Map集合
- 多校第七场 1011 hdu 5379 Mahjong tree(树形dp)
- hdu1075(trie树)
- 通用权限拦
- 六大原则