复合优先于继承,继承是实现代码重用的有力手段,并不是所有情况都适用,使用不当会导致软件变得很脆弱。与方法调用不同的是,继承打破了封装性。

总而言之,组合和继承,都能实现对类的扩展。但是要分具体情况用哪个实现,是Has-a,还是Is-a的关系。

两者区别如下表所示:

组合  继承
has-a关系 is-a关系
运行期决定 编译期决定
不破坏封装,整体和局部松耦合 破坏封装,子类依赖父类
支持扩展,随意增加组合类 只能继承一个父类,必须包含所有方法,增加系统复杂性
动态选择组合类方法 复用父类方法

来自 :http://blog.csdn.net/wangpeifeng669/article/details/26403119

Decorator模式对组合的应用是最经典诠释:

上码

public Ice(Product product) {
this.product = product;
} public double money() {
return product.money() + 1.5;
}
} //加奶:
class Milk implements Product {
private Product product; public Milk(Product product) {
this.product = product;
} public double money() {
return product.money() + 4.0;
}
} //加巧克力:
class Chocolate implements Product {
private Product product; public Chocolate(Product product) {
this.product = product;
} public double money() {
return product.money() + 5.5;
}
}
public class DecoratorModel{
public static void main(String [] args){
Product coffee = new Coffee();
Product sugarCoffee = new Sugar(coffee);
Product sugarmilkCoffee = new Milk(sugarCoffee);
System.out.println("加糖咖啡:"+sugarCoffee.money());
System.out.println("加糖加奶咖啡:"+sugarmilkCoffee.money());
}
} 来自http://www.cnblogs.com/shipengzhi/articles/2086419.html

  

Chapter 02:复合 VS 继承的更多相关文章

  1. java1234教程系列笔记 S1 Java SE chapter 02 写乘法口诀表

    一.水仙花数 1.方式一:这是我的思路,取各个位数的方式.我个人习惯于使用取模运算. public static List<Integer> dealNarcissiticNumberMe ...

  2. java1234教程系列笔记 S1 Java SE chapter 02 lesson 03 java基本数据类型

    第二章 第三节 数据类型 3.1 分类 基本数据类型.引用类型 3.2整型 byte 8 short 16 int  32 long 64 作业: A:1-10求和 B:float double 的最 ...

  3. Chapter 02—Creating a dataset(Part3-补充材料Stat/Transfer)

    Stat/Transfer:在电子表格(worksheet),数据库(database),统计包(statistical package)间进行数据转换,具有简单高效的特点. 资料来源于:http:/ ...

  4. Chapter 02—Creating a dataset(Part2)

    三. 导入数据 图02-03:Source of data that can be imported into a dataset 11. 从键盘导入数据 (1)可能是最简单的数据导入方式. (2)使 ...

  5. Chapter 02—Creating a dataset(Part1)

    一. 数据集 1. 在R语言中,进行数据分析的第一步是创建一个包含待研究数据并且符合要求的数据集. · 选择装数据的数据结构 · 把数据装入数据结构中 2. 理解数据集 (1)数据集通常是矩形的数据列 ...

  6. Chapter 02 - Let's Get Started(C#篇)

    详细解释,书上有哈.直接上代码和结果. Xcode下的自定义类 (通过new file-> cocoa class创建,保持和书中名字一样RandomController),自定义的fields ...

  7. Java复合优先于继承

    复合优于继承 继承打破了封装性(子类依赖父类中特定功能的实现细节) 合理的使用继承的情况: 在包内使用 父类专门为继承为设计,并且有很好的文档说明,存在is-a关系 只有当子类真正是父类的子类型时,才 ...

  8. MOOC C++笔记(五):继承

    第五周:继承 继承和派生的基本概念 继承:在定义一个新的类B时,如果该类与某个个已有的类A相似(指的是B拥有A的全部特点),那么就可以把A作为一个基类,而把B作为基类的一个派生类(也称子类). 派生类 ...

  9. 高效C++:继承和实现

    如何正确的使用继承和实现是本章说明的重点. 确定public继承的关系是is-a public继承等同于is-a 对public继承,所有base的特性,在derived上都适用 避免遮掩继承而来的名 ...

随机推荐

  1. 高手总结的CSS执行顺序及其优先权问题汇总

    今天在看一本书时又看到了”CSS优 先权“这个问题,感觉这个问题还是比较重要的,也算是样式的特异性吧,尤其是在面对较多.较深层.较复杂的样式属性时,理解CSS的加权计算方法对于重写 样式属性之类的问题 ...

  2. debian修改系统语言为英文

    原文地址:http://www.chenyudong.com/archives/debian-change-locale-language.html 修改/etc/default/locale 文件里 ...

  3. thinkphp使用模块/控制器/操作访问时出现No input file specified.解决方式

    thinkphp使用 http://serverName/index.php/模块/控制器/操作 访问时,出现了 No input file specified. 的错误 解决办法: 一: 开启cgi ...

  4. tomcat j2ee 目录结构

    一.TOMCAT的目录结构 /bin:存放windows或Linux平台上启动和关闭Tomcat的脚本文件 /conf:存放Tomcat服务器的各种全局配置文件,其中最重要的是server.xml和w ...

  5. 转:DataTable的一些特殊用法:Select

    当你从数据库里取出一些数据,然后要对数据进行整合,你很容易就会想到: 1DataTable dt = new DataTable();//假设dt是由"SELECT C1,C2,C3 FRO ...

  6. 2.8 Classes of Restricted Estimators

    根据所加限制的不同,可以将模型分为以下几类 RSS+Roughness penalty $PRSS(f;\lambda)=RSS(f)+\lambda J(f)$ 其中$J(f)$为对函数$f$的pe ...

  7. tomcat配置访问日志,访问首页主目录

    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" ...

  8. 给Visual Studio更替皮肤和背景图

    给Visual Studio更换皮肤和背景图 1.先安装更换皮肤的插件  VS菜单栏里面找到:工具>扩展和更新>联机>搜索: Theme Editor   下载并安装: 安装后先不着 ...

  9. 格而知之3:Core Data的基本使用

    最近准备做一个随手笔记类的app给自己用,考虑到从未使用过Core Data,就决定用Core Data来做数据存储.在网上参考了一些Core Data的资料后,用一天的时间写了这个demo,主要测试 ...

  10. java笔记之String的应用

    说来这String字符串也是运用广泛了,但是String的一些使用方法你是否能够了解清楚呢? 这是我这几天来整理的String笔记,其实这也是不全面的,要想深入了解,还得自己去oracle官网看JDK ...