`
zjliu
  • 浏览: 48549 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

面向对象设计原则七 - 组合优先于继承

阅读更多

组合

  • 通过创建一个由其他对象组合的对象来获得新功能的重用方法
  • 新功能的获得是通过调用组合对象的功能实现的
  • 有时又叫聚合
  • 例如:
    • 一个对象拥有或者对另外一个对象负责并且两个对象有相同的生命周期。(GOF)
    • 一个对象包含另一个对象集合
    • 被包含对象对其他对象是不可见的并且只能从包含它的对象中访问的特殊组合形式

组合的优缺点

  • 优点
    • 被包含对象通过包含他们的类来访问
    • 黑盒重用,因为被包含对象的内部细节是不可见的
    • 很好的封装
    • 每个类专注于一个任务
    • 通过获得和被包含对象的类型相同的对象引用,可以在运行时动态定义组合的方式
  • 缺点
    • 结果系统可能会包含更多的对象
    • 为了使组合时可以使用不同的对象,必须小心的定义接口

继承

  • 通过扩展已实现的对象来获得新功能的重用方法
  • 基类有用通用的属性和方法
  • 子类提供更多的属性和方法来扩展基类

继承的优缺点

  • 优点
    • 新的实现很容易,因为大部分是继承而来的
    • 很容易修改和扩展已有的实现
  • 缺点
    • 打破了封装,因为基类向子类暴露了实现细节
    • 白盒重用,因为基类的内部细节通常对子类是可见的
    • 当父类的实现改变时可能要相应的对子类做出改变
    • 不能在运行时改变由父类继承来的实现

由此可见,组合比继承具有更大的灵活性和更稳定的结构,一般情况下应该优先考虑组合。只有当下列条件满足时才考虑使用继承:

  • 子类是一种特殊的类型,而不只是父类的一个角色
  • 子类的实例不需要变成另一个类的对象
  • 子类扩展,而不是覆盖或者使父类的功能失效

实例

参见Effective Java第四章第14条

分享到:
评论
1 楼 yongtech 2009-07-13  
ZJ, 更新得挺勤快的啊,呵呵.

涉猎的方面越来越广泛了,

这些原则如果能配一些图形解释就更形象了.

加油啊,呵呵.

相关推荐

    C# 面向对象的基本原则

    C#面向对象的基本原则 一、面向接口编成而不是实现 [Code to an interface rather than to an implementation.] 二、优先使用组合而非继承 [Favor Composition Over Inheritance.] 三、SRP: The single ...

    JavaNote:java es番石榴jdk jdk8 jsonLombokmd线程jvm spring mvc vertx设计模式风暴

    基于以下的面向对象设计原则。 - 对接口编程而不是对实现编程。 - 优先使用对象组合而不是继承。 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern...

    谷歌师兄的leetcode刷题笔记-JavaNote:javaesguavajdkjdk8jsonlombokmdthreadjvmsprin

    基于以下的面向对象设计原则。 - 对接口编程而不是对实现编程。 - 优先使用对象组合而不是继承。 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern)...

    gof:GoF的23种设计模式

    GoF 设计模式GoF所提出的23种设计模式主要基于以下面向对象设计原则:对接口编程而不是对实现编程优先使用对象组合而不是继承23种设计模式分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural ...

    亮剑.NET深入体验与实战精要2

    13.6 面向对象设计的原则 478 13.6.1 优先使用(对象)组合,而非(类)继承 478 13.6.2 针对接口编程,而非(接口的)实现 481 13.6.3 开放-封闭法则(OCP) 482 13.6.4 Liskov替换法则(LSP) 485 13.6.5 单一...

    亮剑.NET深入体验与实战精要3

    13.6 面向对象设计的原则 478 13.6.1 优先使用(对象)组合,而非(类)继承 478 13.6.2 针对接口编程,而非(接口的)实现 481 13.6.3 开放-封闭法则(OCP) 482 13.6.4 Liskov替换法则(LSP) 485 13.6.5 单一...

    UML和模式应用(架构师必备).part06.rar

    第1章 面向对象分析和设计 1.1 本书的主要内容 1.2 最重要的学习目标 1.3 什么是分析和设计 1.4 什么是面向对象分析和设计 1.5 简短示例 1.6 什么是UML 1.7 可视建模的优点 1.8 历史 1.9 参考资料 第2章 ...

    UML和模式应用(架构师必备).part01.rar

    第1章 面向对象分析和设计 1.1 本书的主要内容 1.2 最重要的学习目标 1.3 什么是分析和设计 1.4 什么是面向对象分析和设计 1.5 简短示例 1.6 什么是UML 1.7 可视建模的优点 1.8 历史 1.9 参考资料 第2章 ...

    UML和模式应用(架构师必备).part07.rar

    第1章 面向对象分析和设计 1.1 本书的主要内容 1.2 最重要的学习目标 1.3 什么是分析和设计 1.4 什么是面向对象分析和设计 1.5 简短示例 1.6 什么是UML 1.7 可视建模的优点 1.8 历史 1.9 参考资料 第2章 ...

    UML和模式应用(架构师必备).part02.rar

    第1章 面向对象分析和设计 1.1 本书的主要内容 1.2 最重要的学习目标 1.3 什么是分析和设计 1.4 什么是面向对象分析和设计 1.5 简短示例 1.6 什么是UML 1.7 可视建模的优点 1.8 历史 1.9 参考资料 第2章 ...

    UML和模式应用(架构师必备).part03.rar

    第1章 面向对象分析和设计 1.1 本书的主要内容 1.2 最重要的学习目标 1.3 什么是分析和设计 1.4 什么是面向对象分析和设计 1.5 简短示例 1.6 什么是UML 1.7 可视建模的优点 1.8 历史 1.9 参考资料 第2章 ...

    UML和模式应用(架构师必备).part04.rar

    第1章 面向对象分析和设计 1.1 本书的主要内容 1.2 最重要的学习目标 1.3 什么是分析和设计 1.4 什么是面向对象分析和设计 1.5 简短示例 1.6 什么是UML 1.7 可视建模的优点 1.8 历史 1.9 参考资料 第2章 ...

    UML和模式应用(架构师必备).part08.rar

    第1章 面向对象分析和设计 1.1 本书的主要内容 1.2 最重要的学习目标 1.3 什么是分析和设计 1.4 什么是面向对象分析和设计 1.5 简短示例 1.6 什么是UML 1.7 可视建模的优点 1.8 历史 1.9 参考资料 第2章 ...

    UML和模式应用(架构师必备).part05.rar

    第1章 面向对象分析和设计 1.1 本书的主要内容 1.2 最重要的学习目标 1.3 什么是分析和设计 1.4 什么是面向对象分析和设计 1.5 简短示例 1.6 什么是UML 1.7 可视建模的优点 1.8 历史 1.9 参考资料 第2章 ...

    JAVA基础课程讲义

    面向对象思想初步(OOP初步Object Oriented Programming) 53 面向对象编程的语言的三大特征简介 56 对象和类的概念 56 类和对象初步 57 测试类的定义方式 57 简单的学生类编写示例 58 内存分析 59 属性(field,或者...

    Spring-Reference_zh_CN(Spring中文参考手册)

    13.11. 惯例优先原则(convention over configuration) 13.11.1. 对控制器的支持: ControllerClassNameHandlerMapping 13.11.2. 对模型的支持:ModelMap (ModelAndView) 13.11.3. 对视图的支持: ...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    7.5.6 重载中的最难点——参数匹配原则 171 7.6 使用类的实例作为方法参数 172 7.6.1 超车方法:使用类实例做参数 172 7.6.2 调用这个方法 173 7.6.3 发生了什么 174 7.7 加餐:局部变量和实例变量 175 7.7.1 ...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    7.5.6 重载中的最难点——参数匹配原则 171 7.6 使用类的实例作为方法参数 172 7.6.1 超车方法:使用类实例做参数 172 7.6.2 调用这个方法 173 7.6.3 发生了什么 174 7.7 加餐:局部变量和实例变量 175 7.7.1 ...

Global site tag (gtag.js) - Google Analytics