Chapter 02:复合 VS 继承

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

总而言之,组合和继承,都能实现对类的扩展。但是要分具体情况用哪个实现,是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

  

 

时间: 2024-10-03 20:18:34

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

《Effective Java》学习笔记(3)

笔记  四.类和接口 第12条:使类和成员的可访问能力最小     为了更好的实现信息隐藏,降低各模块的耦合度,尽可能地降低类和成员的访问能力是必须的.有一点特别关键,就是公有的静态final域几乎全部是错误的.客户可以修改这样的成员数组,应该改为私有的才是安全的. 第13条:支持非可变类 使一个类成为非可变类需要做到以下5点: 1.不能提供任何会修改对象的方法 2.保证没有可被子类覆写的方法,可以通过使这个类为final来达到 3.使所有的成员变量都是final 4.使所有的成员变量都为私有

GEF学习笔记(二) 模拟GEF设计思路,解剖GEF 1

GEF如同其他的一些framework一样,是一个复杂庞大(有点夸张)的,当我们想使用驾驭它时,就必须全面的理解其整体构架及其运作过程.这需要我们的毅力和敏锐.旅途开始了-. GEF主要的任务是针对2D图形编辑操作,如下图. 为了使GEF能够广泛的用于种类繁多2D图形编辑领域,GEF就必须建立一个严格的易扩充/易组合/易重用的MVC框架(当然这种分解细化功能对象的方法思想,我们可以用在其它的地方,其它领域.其他语言如C#上). 那么如果设计 这个 严格的MVC框架(对于Model是严格的独立,它

和我一起学Effective Java之类和接口

类和接口 使类和成员的可访问性最小 信息隐藏(information hiding)/封装(encapsulation):隐藏模块内部数据和其他实现细节,通过API和其他模块通信,不知道其他模块的内部工作情况. 原因:有效地解除各模块之间的耦合关系 访问控制机制(access control):决定类,接口和成员的可访问性.由声明的位置和访问修饰符共同决定. 对于顶层的类和接口,两种访问级别: 包级私有的(package-private) 公有的(public) 对于成员(域,方法,嵌套类,嵌套

Effective Java 笔记

创建和销毁对象 NO.1 考虑用静态工厂方法代替构造函数 静态工厂方法好处: 1.构造函数有命名的限制,而静态方法有自己的名字,更加易于理解. 2.静态工厂方法在每次调用的时候不要求创建一个新的对象.这种做法对于一个要频繁创建相同对象的程序来说,可以极大的提高性能.它使得一个类可以保证是一个singleton:他使非可变类可以保证"不会有两个相等的实例存在". 3.静态工厂方法在选择返回类型时有更大的灵活性.使用静态工厂方法,可以通过调用方法时使用不同的参数创建不同类的实例,还可以创建

《Rhino3D 4.0产品造型设计学习手册》——Part.01 了解Rhino 3D

Part.01 了解Rhino 3D Rhino3D 4.0产品造型设计学习手册 Part 01 Chapter Chapter 01 Rhino 3D介绍与特征 Chapter 02 Rhino 3D的应用领域 Chapter 03 Rhino3D有关网站 Chapter 04 Rhino3D安装与环境设置 Chapter 05 Rhino3D用户界面与关键术语 了解Rhino 3D的基础知识是学习的第一步.在这部分,我们会学到Rhino 3D是何种软件.它诞生的历史及其特征等知识.掌握这些基

深入剖析java中的集合框架_java

解析:如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象,那么可以使用Java集合框架. 如果启用集合的删除方法,那么集合中所有元素的索引会自动维护. 集合完全弥补了数组的缺陷. 02.集合框架的内容  集合框架都包含三大块内容:对外的接口,接口的实现和对集合运算的算法  01.接口:表示集合的抽象数据类型  02.实现:集合框架中接口的具体实现  03.算法:在一个实现了某个集合框架的接口的对象身上完成某种有用的计算方法 java集合框架简图:    01.Collection接

java基础-java面向对象编程二

01.面向对象(static关键字) 用法:是一个修饰符,用于修饰成员(成员变量和成员函数). 当成员被静态修饰后,就多了一种调用方式,除了可以被对象调用之外,还可以被类名直接调用.类名.静态成员. 对象的特有内容随着对象存储,共有内容可以定义为静态的,放在共享区. 类中的方法区,共享区,数据区都在同一个区. static的特点: (1)随着类的加载而加载,随着类的消失而消失.也就是说,静态会随着类的消失而消失,说明他的生命周期最长. (2)优先于对象存在:明确一点:静态先存在,对象后存在. (

Java 集合系列09之 Map架构

概要 前面,我们已经系统的对List进行了学习.接下来,我们先学习Map,然后再学习Set:因为Set的实现类都是基于Map来实现的(如,HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的). 首先,我们看看Map架构. 如上图:(01) Map 是映射接口,Map中存储的内容是键值对(key-value).(02) AbstractMap 是继承于Map的抽象类,它实现了Map中的大部分API.其它Map的实现类可以通过继承AbstractMap来减少重复编码.

C++:使用复合(composition) 代替 private继承

复合方式(composition)和 private继承, 都能表示, 根据某个类实现出新的类的形式, 即通过使用protected成员, 和重写virtual函数. 优先选择复合方式. 原因: 1. 复合方式, 可以实现重写virtual函数, 然后阻止派生类重新定义virtual函数; 2. 可以使Widget的编译依存度降至最低, 即只包含类的声明式(复合), 而避免包含基类的头文件(继承); 例外: private继承, 可以使EBO(空白基类最优化), 在某些空白基类的情况下很重要,