合成/聚合复用原则(CARP)
组合/聚合复用原则(Composite/Aggregate Reuse Principle或CARP),就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新对象通过向这些对象的委派达到复用已有功能的目的。这两种都是关联关系的一种,聚合表示整体与部分的关系,部分可以脱离整体作为独立个体存在;组合是一种更强的聚合,部分组成整体,但部分不可作为独立个体单独存在,部分的生命周期不能超过整体的生命周期。聚合好比电脑与鼠标,组合好比人与心脏。
组合/聚合与继承是实现复用的两个基本途径,继承复用通过扩展一个已有对象的实现来获取新功能,基类负责共同的属性和方法,子类通过新增新的属性和方法对基类进行扩展实现;组合/聚合复用则将已有对象纳入新对象中,使之成为新对象的一部分,新的对象可以调用已有对象的功能。
两种方式各有优缺点:
继承复用,优点是新的实现或修改较为容易,超类功能继承到子类。但继承复用破坏封装,超类的改变带动子类改变,超类继承的实现是静态,不可再运行时发生改变,灵活性不足。
组合/聚合复用,缺点是有较多对象需要管理,而且对接口的定义要求较严格,是为了实现不同的对象作为组合块;优点是支持封装,依赖较少,新加类可将焦点集中一个任务上,内部细节对新对象不可见,新对象只可通过接口对成分对象的读取,新对象可动态在成分对象中使用。
经验告诉我们应该“尽量使用组合/聚合,尽量不使用继承”。即优先使用对象组合/聚合,而非继承。
使用继承关系有如下规则:
①子类是超类的一个特殊种类,而不是超类的一个角色。
②永远不会出现需要将子类换成另外一个类的子类的情况。如果不能肯定将来是否会变成另外一个子类的话,就不要使用继承。
③子类具有扩展超类的责任,而不是具有置换掉或注销掉超类的责任。如果一个子类需要大量的置换掉超类的行为,那么这个类就不应该是这个超类的子类。
喜欢研究java的同学可以交个朋友,下面是本人的微信号:
合成/聚合复用原则(CARP)的更多相关文章
- 设计模式六大原则——合成/聚合复用原则(CARP)
1.定义 简而言之,对于合成/聚合复用原则的定义就是:要尽量使用合成和聚合,尽量不要使用继承. 2.释义 为什么"要尽量使用合成和聚合.尽量不要使用继承"呢? 这是由于: 第一,继 ...
- 《设计模式》-原则五:合成/聚合复用原则(CARP)
这个也好理解 ,这个合成/聚合复用原则指的是在一个新的对象里面使用一些已有的对象,使其成为新对象的一部分.新对象通过委派达到复用已有功能的效果. 说到这里要讲提及到“Has-A” 和“Is-A”的区别 ...
- Java设计模式——合成/聚合复用原则
一.什么是合成/聚合复用原则? 合成/聚合复用原则是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分:新的对象通过向这些对象的委派达到复用已有功能的目的. 简述为:要尽量使用合成/聚合,尽 ...
- 设计模式原则(7)--Composition&AggregationPrinciple(CARP)--合成&聚合复用原则
作者QQ:1095737364 QQ群:123300273 欢迎加入! 1.定义: 要尽量使用合成和聚合,尽量不要使用继承. 2.使用场景: 要正确的选择合成/复用和继承,必须透彻地理 ...
- 合成/聚合复用原则(Composite/Aggregate Reuse Principle, CARP)
尽量使用对象组合,而不是继承来达到复用的目的 未完待续
- 设计模式之合成/聚合利用原则(CARP)
一.概念 CARP:CompositionAggregation Principle 合成聚合复用原则,尽量使用合成/聚合,尽量不使用类继承.合成聚合是“has a”的关系,而继承是“is a”的 ...
- 面象对象设计原则之七:合成复用原则(Composition/Aggregate Reuse Principle, CARP)
合成复用原则又称为组合/聚合复用原则(Composition/Aggregate Reuse Principle, CARP),其定义如下: 合成复用原则(Composite Reuse Princi ...
- 设计模式课程 设计模式精讲 3-11 合成复用原则coding
1 课堂概念 1.0 继承关系的选择 1.1 起名 1.2 定义 1.3 组合聚合优缺点 1.4 继承优缺点 1.5 组合聚合区别 2 代码演练 2.1 反例 2.2 正例 3 疑问解答3.1 疑问解 ...
- 融会贯通——最常用的“合成复用原则”技能点Get
复用一个类的时候,多使用对象的组合/聚合的关联关系,而不是继承. 之前提到的"依赖倒转原则",是以里氏代换原则为基础的实现开闭原则目标的手段,这一条路线涉及到的是类的继承(包括单继 ...
随机推荐
- mysql之查询
#数据准备drop table if exists class;create table class( class_no int(2) unsigned zerofill primary key ...
- 个人建站&mac下安装hexo
title: 个人建站&mac下安装hexo date: 2018-04-18 16:34:02 tags: [mac,blog,个人建站,markdown] --- 这两天使用了markdo ...
- [SDOI2009]学校食堂Dining
题目描述 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负整数 ...
- bzoj 2555: SubString
Description 懒得写背景了,给你一个字符串init,要求你支持两个操作 (1):在当前字符串的后面插入一个字符串 (2):询问字符串s在当前字符串中出现了几次?(作为连续子串) 你必须在线支 ...
- ●洛谷P2664 树上游戏
题链: https://www.luogu.org/problemnew/show/P2664题解: 扫描线,线段树维护区间覆盖 https://www.luogu.org/blog/ZJ75211/ ...
- 51 nod 1023 石子归并 V3(GarsiaWachs算法)
1023 石子归并 V3基准时间限制:2 秒 空间限制:131072 KB 分值: 320 难度:7级算法题 N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一 ...
- Educational Codeforces Round 19
A. k-Factorization 题目大意:给一个数n,求k个大于1的数,乘积为n.(n<=100,000,k<=20) 思路:分解质因数呗 #include<cstdio> ...
- 51Nod 1196 字符串的数量
用N个不同的字符(编号1 - N),组成一个字符串,有如下要求: (1) 对于编号为i的字符,如果2 * i > n,则该字符可以作为结尾字符.如果不作为结尾字符而是中间的字符,则该字符后面可以 ...
- 浅谈java中内置的观察者模式与动态代理的实现
一.关于观察者模式 1.将观察者与被观察者分离开来,当被观察者发生变化时,将通知所有观察者,观察者会根据这些变化做出对应的处理. 2.jdk里已经提供对应的Observer接口(观察者接口)与Obse ...
- 第四次C语言作业
(一)改错题 输出三角形的面积和周长,输入三角形的三条边a.b.c,如果能构成一个三角形,输出面积area和周长perimeter(保留2位小数):否则,输出"These sides do ...