`
eneasy
  • 浏览: 126427 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

抽象和封装

阅读更多
二.抽象和封装
整理自 《java与模式》阎宏编著

1.关于抽象类
    只要有可能,不要从具体类继承。
   
    如图,在一个以继承关系形成的等级结构里面,树叶节点应该是具体类,而树枝节点应该是抽象类或接口。
    抽象类应该拥有尽可能多的共同代码。
   
    抽象类应该拥有尽可能少的数据。
   
    在一个继承的等级结构中,共同的代码应该尽可能的往等级结构的上方移动。把重复的代码从子类移到超类中,可以提高代码的复用率。一个对象从超类继承过来的代码,在不使用时不会造成对资源的浪费。  
    一个对象的数据,无论是否使用都会占用资源,因此数据应该尽量放到具体类或等级结构的低端。
   
   

2.对可变性封装原则
    “找到系统的可变因素,将它封装起来”,称为可可变性封装原则,是实现“开-闭”原则的途径,与合成/聚集复用原则相辅相成。
     抽象化与实现化的最简单实现,也就是“开-闭”原则在类层次上的最简单的实现,如下图所示:
   
    一般来说,一个继承结构中的第一层是抽象角色,封装了抽象的商业逻辑,这是系统中不变的部分。第二层是实现角色,封装了设计中会变化的因素。这个实现允许实现化角色有多态性变化。如下图所示:
   
    换言之,客户端可以持有抽象化类型的对象,而不在意对象的真实类型是“实现化”、“实现化1”、“实现化2”、“实现化3”。如下图所示:
   
    显然,每一个继承关系都封装了一个变化因素,而一个继承关系不应当同时处理两个变化因素。换言之,这种简单实现不能够处理抽象化与实现化都面临变化的情况。如下图所示:
   
    上图中的两个变化因素应当是彼此独立的,可以在不影响另一者的情况下独立演化。比如,下面的两个等级结构分别封装了自己的变化因素,由于每一个变化因素都是可以通过静态关系表达的,因此分别使用继承关系实现,如下图所示:
   
    那么在抽象化与实现化之间的变化怎么办?
    正确的设计方案应当是使用两个独立的等级结构封装两个独立的变化因素,并且在它们之间使用聚合关系,以达到功能复合的目的。自然地引导到桥接模式上面。如下图所示:
          
    从另一个角度讲,一个好的设计通常没有多于两层的继承等级结构。或者说,如果出现了两个以上的变化因素,就需要找出哪一个变化因素是静态的,可以使用继承关系;哪一个变化因素是动态的,可以使用聚合关系。



3.接口
    接口只定义了方法的特征,而没有给出具体的实现。由于接口没有给出任何实现,所以它比抽象类更为抽象。
    接口是软件可插拨性(pluggable)的保证。
    在一个类等级结构中的任何一个类都可以实现一个接口。这个接口会影响到此类的所有子类。此类不得不实现这个接口中所规定的方法,而其子类自动继承到这些方法,也可以置换掉这些方法(或者其中一些方法)。这时候,这些子类就具有了可插拨性。
    关联的可插拨性:
    一个对象需要完成一项任务,所以需要知道其它对象,并调用其它对象的方法。这个对象对其它对象的知识叫做关联。
如果一个关联不是针对一个具体的类, 而是针对一个接口,那么任何实现这个接口的类都可以满足要求。换句话说,当前对象并不在意关联的是那一个具体的类,而仅仅关心这个类是否实现了某个接口。
这样就可以动态地将这个关联从一个具体的类转换成另外一个具体的类,这么做的惟一条件是它们实现了相同的接口。
    调用的可插拨性:
    一个对象不可避免地调用其它对象的方法,这种调用不一定非得是一个具体的类,而可以是接口,这样一来,所以实现这个接口的具体类都可以被当前对象调用。而当前对象可以动态地决定调用哪一个具体类的实例。
因此接口提供了关联和方法调用的可插拨性,使得软件在灵活性,可扩展性,可插拨性得到了保证。
分享到:
评论

相关推荐

    清华大学JAVA教程--类、抽象和封装(教师课件)

    清华大学的课件。主要是抽象和封装,有兴趣的可以看看。

    java oop理论(抽象和封装)

    主要讲述了java oop中关于抽象与封装的理论知识。

    抽象和封装PPT

    1.如何抽象出类 1.1 找简单名词 ----------发现类 1.2 找修饰性名词或形容词 ---------发现类的属性 1.3 找动词 ------------发现类的方法 1.4 事不关几,高高挂起 ---------------类的方法和属性只放需要的 1.5 谁...

    学习笔记:抽象封装、继承、多态.doc

    本文档记录了类与类的、抽象封装、继承、多态几种表现形式,通过实际开发,加上自已的理解总结了这几种表现形式。。对开刚学习java的朋友们非常有用,还加上的例子,比较易懂。。。欢迎大家下载哦。。

    实验三 抽象与封装.docx

    实验三 抽象与封装.docx

    da06抽象继承封装多态接口.zip

    Flutter抽象继承封装多态接口案例,基于vscode开发工具,通过运行Flutter中的Test文件,来测试flutter中的继承,抽象,多态,封装,接口的概念

    ToolBar封装抽象类统一项目风格

    Toolbar是活动的标题栏,把ToolBar 封装成一个抽象Base类,可以加快开发的脚步使代码更整洁清晰。这里我附上源码,非常实用,新手必备,加快开发速度和保持项目统一风格。

    第3章 抽象与封装.ppt

    第3章 抽象与封装.ppt

    第四章 抽象、封装与类.pptx

    第四章 抽象、封装与类.pptx

    4第四章 抽象、封装与类.ppt

    4第四章 抽象、封装与类.ppt很好的学习资料 不要错过了

    DAC1210简单资料

    简单芯片介绍,公供用于设计参考,希望可以帮上大家的忙。

    如何重构DAO模式

    使用数据访问对象(DAO,Data Access Object)模式来抽象和封装所有对数据源的访问。DAO管理着与数据源的连接以便检索和存储数据。可以降低商业逻辑层和数据访问层的耦合度,提高应用的可维护性和可移植性。 由于...

    4第四章 抽象、封装与类-补充.ppt

    4第四章 抽象、封装与类-补充.ppt很好的学习资料 不要错过了

    虚拟煤矿三维引擎架构设计及实现

    不能实现与地质测量数据同步更新和专业应用等缺点,结合煤矿动态开采特点,将煤矿虚拟矿井系统的核心技术进行抽象和封装,提出了面向煤矿应用的三维引擎架构,快速高效地构建煤矿虚拟矿井系统,通过空间数据引擎动态地...

    Java语言与面向对象程序设计第07讲抽象与封装

    java语言与面向对象设计PPT,讲解的很是详细,很适合初级学员仔细拜读,里面还有很多随堂练习题

    tcp server boost asio

    由于以上多种原因,决定对boost库进行更高的抽象和封装,对开发者提供一种更为便利的使用接口。 本代码实现了一下主要功能: 1.、为每个TCP客户端建立session,每个session创建事件,向应用开发则投递事件。 事件...

    TTC.rar_showtime_ttc

    函数只是对问题进行了抽象和封装的描述,问题的解决还要通过“类的实例”——对象之间的 消息传递来完成,这里的主程序的功能就是声明对象并传递消息。 程序中语句”yCtdk.showTime()就是对象调用函数的标准形式,...

    java程序设计-第4章-抽象、封装与类.pptx

    java程序设计_第4章_抽象、封装与类.pptx

    论文研究-基于J2EE多层架构的Web开发框架研究.pdf

    在经典的J2EE四层体系结构的基础上增加数据...应用DAO设计模式在业务逻辑层与持久层之间设计了多源数据访问组件,抽象和封装了对不同数据源的数据访问操作,实现对不同类型、结构、环境、用法的异构数据库的统一访问。

Global site tag (gtag.js) - Google Analytics