`
kfaren
  • 浏览: 12047 次
  • 性别: Icon_minigender_1
  • 来自: 烟台
最近访客 更多访客>>
社区版块
存档分类
最新评论

复用类——组合,代理,还是继承?

阅读更多

      类的复用基本是三种方式,组合,代理,继承。为了同样的复用目的,都是想在构建一个新类的时候加入一个已有类的对象。使用组合是直接在一个新类中new一个对象,使用继承其实也是通过构造方法中调用父类构造方法隐式的加入一个已有类的对象,所不同的是,使用组合更具灵活性,可以自主的选择需要加入什么对象,而使用继承则是强迫必须加入一个父类的对象。另外还可以使用代理,通过在新类中创建一个对象,并在方法中调用这个对象的方法,从而达到包装一个新方法的目的。尽管面向对象编程对继承极力强的,但在设计一个新类的时候,一般应有效选择组合(或者可能是代理),确实必要的时候才使用继承。实际上应该很少去继承一具体的类,大多数时候应该考虑继承抽象类和去实现接口。
创建一新类到底应该使用组合还是继承,判断的标准应该是新类是否需要向上转型,也就是说新类是否需要复用接口。
思考一个问题的时候,目的是很重要的,必须不断问自己的目的是什么。同样为的是复用类,采用不同的方法会有不同的效果。但是首要考虑的应该是降低类的复杂度,这也是OOP思想的出发点。尽量简化问题。

一  关于组合
在类中初始化对象的位置


1.在定义对象的地方,这意味着总是能够在构造器调用之前被初始化

2.在类的构造器中
3.就在使用这些对象之前进行初始化,这样的初始化叫做惰性初始化,在生成对象不值得及不必每次都生成对象的情况下,这样做明显会减少很多负担
4.使用实例初始化,比如在声明一个String对象的同时初始化她:String s ="实例初始化";

二 关于继承
    继承一个类是通过在新类的构造方法中强迫去调用父类的构造方法来实现的。这样做更本质的讲相当于每次在new一个新类的对象时都必须先new一个父类的对象。简单说,当创建一个导出类对象时,该对象包含了一个基类的对象。

    为了继承,一般的规则是将类的所有成员变量都指定为private,将所有的方法都指定为public.这样做能够保证顺利继承,以后再去完善是否需要设置protected或者把一个方法设置为private.另外可以在导出类中使用"super.方法名"来强调调用的是父类的方法,这样做可以在想复写基类方法的时候需要去调用基类这个同名方法的时候得到好处。
    明显,使用继承的好处是可以向上转型。实质是子类继承了父类的接口,由于这些被强迫继承的接口是一样的,所以可以把子类对象向上转型为父类(即让一个父类的引用变量指向一个子类对象),从而通过父类的视野去使用。简单的说,子类向上转型后仅能看见父类的成员,也就是说不能访问子类新增的成员,但是调用一个方法的时候,编译器会去做动态绑定以保证能够调用到被改写的方法。
    所以说单纯继承是一种“纯替代”是一种is-a的关系,扩展继承是一种“like-a”的关系。

三 关于代理
    当想复用一个类的部分方法时,在新类中创建一个成员对象后,在新类中的方法中通过这个成员对象去调用它自己的方法,这种包装成员方法来获得一个新方法的技术可以避免继承导致完全暴露父类方法的问题。这是一种十分灵活的技术。可以趣称为“部分继承”。
    代理——灵活的包装方式。

分享到:
评论

相关推荐

    设计模式——GFour

    结构型模式则关注如何将不同组件组合成更复杂的结构,包括适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式。这些模式帮助我们处理类与类之间的关系,使得代码结构更加清晰,增强了系统的...

    设计模式——装饰模式

    装饰模式的主要优点是它提供了比继承更灵活的扩展对象的方式,因为通过组合多个装饰类,我们可以自由地组合出所需的功能,而不是受限于固定的继承层次结构。此外,装饰模式还可以避免因过度使用继承导致的类爆炸问题...

    一些面向对象的设计原则.doc

    本文档重点介绍了两个核心概念——组合与继承,并探讨了它们的优劣以及适用场景。 ### 组合:优先选择 #### 定义 组合是一种复用机制,它通过在一个类中包含其他类的实例,使得该类能够利用这些实例提供的功能,而...

    设计模式-可复用面向对象软件的基础

    总结来说,《设计模式——可复用面向对象软件的基础》这本书是面向对象设计的宝典,无论是初学者还是经验丰富的开发者,都能从中受益匪浅,理解并掌握这些设计模式将对提升软件开发的专业素养有着深远的影响。

    一些面向对象的设计法则.doc

    本文档探讨了面向对象编程(OOP)中一个重要的设计原则——优先使用对象组合而非类继承。这一原则强调了通过组合现有对象来构建新功能,而不是通过继承现有的类。通过深入分析该原则背后的理论基础、应用场景及其实现...

    设计模式可复用面向对象软件的基础4.pdf

    ### 设计模式——结构型模式概述 #### 一、引言 在面向对象软件开发过程中,设计模式作为一种最佳实践被广泛应用于解决常见的设计问题。结构型模式是设计模式的一种类型,它关注的是如何通过组合类和对象来创建更大...

    设计模式可复用面向对象软件的基础

    - **结构型模式**:关注类或对象的组合,以实现新的功能,例如适配器模式、装饰者模式、代理模式、桥接模式、组合模式和外观模式。 - **行为型模式**:关注对象间的职责分配,例如策略模式、命令模式、迭代器模式、...

    设计模式——JAVA.docx

    合成/聚合复用原则(CRP)建议在可能的情况下优先使用组合/聚合而非继承来实现复用。这种方法的优点在于可以减少类间的耦合度,使得类的设计更加灵活,易于维护。 - **定义**:在一个新的对象里面使用一些已有的对象...

    设计模式可复用面向对象软件基础 pdf

    结构型模式如适配器模式(Adapter)、装饰器模式(Decorator)和代理模式(Proxy),处理对象的组合和结构,帮助不同组件间进行有效通信。行为型模式如观察者模式(Observer)、策略模式(Strategy)和命令模式...

    《重构——改善既有代码的设计》

    - **引入本地扩展 (Introducelocal Extension)**:在当前类中定义特定于上下文的新函数,提高代码的针对性和复用性。 - **引入 Null 对象 (Introduce Null Object)**:通过引入特殊的 Null 对象来代替空引用,避免空...

    数据结构与算法——面向对象C++设计模式

    C++中的设计模式分为创建型(如工厂模式、单例模式)、结构型(如适配器模式、代理模式)和行为型(如观察者模式、策略模式)三大类。理解并应用这些设计模式,可以提高代码的可读性和可维护性,同时也便于团队间的...

    23种设计模式-结构型模式.docx

    对象适配器模式则通过组合来实现适配,它创建一个包含Adaptee对象的新类,该类实现了Target接口,并在其内部调用Adaptee的方法。这样,客户端就可以通过Target接口与适配后的Adaptee进行交互。如以下示例所示: ```...

    设计模式 - 可复用面向对象软件的基础(高清版).rar

    在处理复杂的系统时,组合模式(Composite)可以帮助我们将简单对象和复杂对象以统一的方式处理,而代理模式(Proxy)可以用于控制对对象的访问权限或增加额外的功能。 总的来说,理解和掌握设计模式对于Java开发...

    设计模式精解——GoF23中设计模式解析

    在实际开发中,设计模式的实现通常涉及类的继承、组合、接口的使用以及编程语言的特性。例如,C++实现中会广泛使用模板、多态、虚函数等概念来实现设计模式,而Java中则可能更多地利用抽象类和接口。 总之,设计...

    JAVA设计模式

    - **类结构模式**:通过继承机制,将类和接口组合在一起,形成更复杂的结构。例如,当一个子类继承自多个父类或实现多个接口时,它结合了这些父类和接口的功能,形成了一个新的结构。 - **实例结构模式**:专注于...

    Java设计模式.pdf

    无论是通过继承实现的类形式的变压器模式还是通过对象组合实现的实例形式的变压器模式,都能够有效地解决接口转换的需求。掌握这两种形式的变压器模式可以帮助开发者更加灵活地设计系统架构,提高代码的复用性和可...

Global site tag (gtag.js) - Google Analytics