`
369128396
  • 浏览: 83830 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

组合or继承

    博客分类:
  • java
 
阅读更多

到底使用组合还是继承是每本讲设计的资料里都要讨论一番的话题,两者的目标都是为了实现代码复用。下面说说我对组合和继承的优缺点的理解。

继承缺点:

1.破坏封装性

1)继承所有接口:不管是自己想要的接口还是不想要的接口,统统继承过来,导致对外提供的服务混乱,不利于程序管理

2)父类子类紧耦合:在一些极端的例子中,父类和子类紧耦合,子类依赖于父类的实现细节,如effective java 中add和addAll的自用性的例子。另外父类的些许改变很容易影响到子类

2.很难拓展功能,会造成继承结构膨胀

对于继承来说,设计父类的功能已经不容易,因为需要考虑到所有子类的通用功能,一旦加入新的子类就可能破坏父类的功能,由于子类的多样性,对功能的实现不统一,如无法将功能定义在父类,又想复用代码,只能增加继承结构,导致问题复杂化。

要想更好的复用代码,需要将程序的功能粒度做小,继承做到这点需要扩展继承结果,组合则需要更多的组合类型或组合实现,比较起来组合更简单易于维护。

3.java语言只支持单继承。

继承优点:

1.创建子类对象自动创建父类对象

2.自动继承父类接口

组合的优缺点和继承基本相反。

 

感悟:对象之间的关系和人人关系很类似,可以总结成两点。

1.人与人之间要保持适度的距离,无需过度热情(像继承父子耦合)亦要互相有所助益(像接口)

2.多靠朋友,少靠父母,多个朋友多条路(像组合多个对象)但保持自己的风格,靠父母只能单继承,兄弟姐妹间也不容易分享。

 

 

 

去年因为一个项目写了一点小程序,这个程序可以很好的诠释组合和继承的选择问题。

 

选择组合还是继承只要把握 is-a 和has -a的原则就解决了很多选择的烦恼。即新类需要向基类转化(多态)

 

 

1.

这个程序功能是需要完成一个发送、接收消息的模块,这个模块有两种接受模式,一种为socket模式,一种为auto模式。用继承实现的uml如下图所示:

 上面这个继承设计的问题

1..当有更多类继承ATPASessionHandler时,部分子类的部分方法行为一致,要想复用代码,只能增加继承结构,导致复杂性。当子类变多时,也很难定义父类的功能甚至改变父类的功能连锁子类的变动。

2.当有更多类继承ATPASessionHandler时,程序会很难扩展,比如需要加入新的功能,但并非所以子类都需要,这是这个功能放到父类还是子类呢?结果都不会理想。

 

组合中解决:分离可变行为与不变行为,建立一组新类代表行为,并在TPASessionHandler类中指定行为(即策略模式)

 

用组合实现的uml如下:

 

 利用组合的好处:

1.选择多样化,对于组合类可以选择多个组合接口完成组合类的功能。而不像继承只能单继承。

2.保证接口的独立性,不需要担心与被组合类之间的耦合。

3.扩展功能更容易保持独立性,不需要像继承那样增加继承层次或变动父类影响子类。

 

不错的相关文章

http://blog.csdn.net/hivon/article/details/583558

  • 大小: 15.7 KB
  • 大小: 13.9 KB
分享到:
评论

相关推荐

    类目式文档语义特征AND-OR逻辑表达式生成方法.docx

    各级类目之间按照领域知识体系结构分层逐级展开,具有继承上位、派生下位、并列同位的特征,这些外延特征组合在一起构成了单条类目的上下文信息。 特征词 AND-OR 逻辑组合特征是指类目单元内部的描述/注释信息表述...

    设计模型之桥接模式 bridge C++实现源码,vs2019

    2. 扩展抽象接口(Refined Abstraction):实现了抽象接口,提供了更具体的业务逻辑,并通过继承或组合抽象接口来引用实现接口。 3. 实现接口(Implementor):定义了实现部分的接口,通常是一组操作方法。 4. 具体...

    javascript 面向对象编程基础:继承

    为了实现正确的继承,JavaScript提供了多种方法,如构造函数继承、组合继承、原型链继承、寄生组合继承等。其中,通常推荐使用寄生组合继承,因为它能有效避免上述问题: ```javascript function class1() {} class...

    Haskell and XML, Generic Combinators or Type Based Translation

    XML(可扩展标记语言)是一种用于标记数据的语言标准,它继承自更早的SGML(标准化通用标记语言),但通过简化语法、增强可扩展性等方式提高了实用性。XML不仅用于文档标记,也越来越多地被用作不同应用程序之间进行...

    JAVA桥接模式.doc

    桥接模式通过组合而不是继承,使得抽象部分和实现部分可以独立扩展。当需要添加新的颜色或图形时,无需修改已有的代码,只需添加新的实现类即可。这种方式提高了代码的可维护性和可扩展性,符合面向对象设计的原则,...

    设计模式(16)-Bridge.pdf

    在桥接模式中,抽象化和实现化是通过组合关系而不是继承关系来连接,从而实现解耦。 抽象化(Abstraction)角色是桥接模式的核心,它定义了接口或行为,但并不实现这些行为。在这个角色中,通常有一个对实现化对象...

    桥接模式 C++ 实现

    Abstraction(Implementor* impl) : implementor(impl) {} virtual void doSomething() = 0; }; // 具体抽象 class RefinedAbstractionA : public Abstraction { public: RefinedAbstractionA(Implementor* impl...

    对象关系数据库

    通过对数据类型的支持、抽象数据类型与封装、继承机制、引用和对象标识等关键技术的引入,ORDB不仅保持了关系数据库的优势,还进一步提升了其灵活性和表达能力。随着信息技术的不断发展,ORDB将继续发挥其重要作用,...

    类Class)1

    在QL(Query Language)中,类(Class)是一种用于定义自定义数据类型的机制,它允许用户创建具有特定逻辑属性的值集合。...通过组合特征谓词、成员谓词和字段,我们可以创建出强大的逻辑模型,用于数据查询和分析。

    桥接模式习题5.zip

    在C#中,这种模式尤其适用于处理多种抽象和实现的组合,以提高代码的可扩展性和可维护性。本资源是针对《C#设计模式第2版》一书中,由刘伟老师讲解的桥接模式习题5,提供了作者编写的示例代码,旨在帮助读者深入理解...

    Loving Common Lisp, or the Savvy Programmer's Secret Weapon-Leanpub(2016).pdf

    3. **CLOS(Common Lisp Object System)**:一个先进的面向对象系统,支持多重继承、动态方法组合等功能。 4. **网络编程**:介绍使用Drakma和Hunchentoot进行HTTP服务器端编程的方法。 5. **数据库访问**:包括...

    桥接模式1

    在桥接模式中,抽象部分和实现部分通过组合而非继承来关联,这样可以避免因为继承层次过多而导致的类爆炸问题。 在实际应用中,桥接模式的优缺点如下: 优点: 1. 抽象和实现的分离:通过组合关系,抽象部分和实现...

    22桥接模式.zip

    例如,“桥接模式-手机01”可能是使用Android系统的商务手机,“桥接模式-手机02”可能是使用iOS系统的智能手机,而“桥接模式-手机03”可能是另一种组合,比如Android系统的智能手机。每个具体实现类(Concrete ...

    C#AttributeUsage使用案例详解.docx

    通过 OR 操作,我们可以把若干个 AttributeTargets 值组合起来。 AllowMultiple 属性标记了我们定制特性能否被重复放置在同一个程序实体前多次。如果 AllowMultiple 为 false,则特性不能被重复放置多次。 ...

    设计模式_结构型_桥接模式.md

    实现部分的变化不会影响抽象部分,两者通过组合关系而不是继承关系建立联系。 4. **具体实现部分(ConcreteImplementor)**:继承自实现部分接口,实现具体的业务逻辑。系统可能有多个具体实现部分,它们可以在运行...

    考试类精品--️每天花5分钟的时间,弄懂一道面试题 or Js小知识 来鞭策自己学习思考,每天进步一点,流年笑掷,未.zip

    "每天花5分钟的时间,弄懂一道面试题 or Js小知识"揭示了这份资源的目的,即通过每日的学习和思考,帮助用户逐步提升技能,每天进步一点点。"流年笑掷,未来可期"可能是这个学习计划的口号,鼓励持续努力,期待未来...

    POSTGRESQL中文学习手册

    * 组合类型:point、circle、box等 模式设计 PostgreSQL中的模式(Schema)是数据库中的一个逻辑结构,用于组织和存储数据。模式可以包含多个表、视图、索引、函数和触发器等对象。 表的定义 PostgreSQL中的表是...

    JAVA桥梁模式.docx

    这种模式也被称为柄体模式或接口模式,它有助于实现开闭原则,即对扩展开放,对修改关闭,同时促进组合/聚合复用原则。 **桥梁模式的核心思想**: 1. **抽象化(Abstraction)**:抽象化角色定义了一组接口,这些接口...

    2021-2022计算机二级等级考试试题及答案No.18436.docx

    15. 组合框事件:组合框(ComboBox)的事件处理与Style属性相关,不同的Style设置会影响组合框的行为并触发不同事件。 16. Java继承特性:Java中类只允许单一继承,但可以实现多个接口;一个类可以同时继承一个类和...

    VB.NET 学习资料

    - **逻辑运算符**: `And`、`Or`、`Not`、`Xor`,用于组合布尔表达式。 **3.2 运算符的优先级** - 运算符按特定顺序执行,了解优先级对于正确计算表达式至关重要。 #### 四、Visual Basic .NET 的常量和变量 **4.1...

Global site tag (gtag.js) - Google Analytics