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

抽象和封装

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

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

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



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

相关推荐

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

    **Java编程中的“类、抽象和封装”是面向对象编程的核心概念,对于任何Java学习者来说,这些都是必须掌握的关键知识点。清华大学的JAVA教程以其严谨性和深度广度闻名,本课件便是针对这些核心概念进行深入讲解的教学...

    Java软件开发实战 Java基础与案例开发详解 5-10 抽象和封装章节练习 共4页.pdf

    根据给定文件的信息,我们可以将重点放在第5章“抽象和封装”部分,该章节包含了对面向对象设计思想的关键理解,以及如何通过抽象和封装来提高代码的质量。 ### 5.0 抽象和封装 #### 5.1 面向过程的设计思想 面向...

    java oop理论(抽象和封装)

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

    抽象和封装PPT

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

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

    面向对象设计的核心思想是抽象和封装,这两者在Java编程中占据着中心位置。 抽象是软件开发中的一个关键概念,它允许我们将复杂的系统分解为更小、更易于管理的部分。在Java中,抽象主要体现在两个方面:过程抽象和...

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

    ### 学习笔记: 抽象封装、继承、多态 #### 一、面向对象的基本概念 面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,它使用“对象”来设计软件。对象是由数据(即字段或属性)和对这些数据进行...

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

    其中,抽象、封装和类是面向对象编程的三大核心概念,它们不仅为程序员提供了构建复杂系统的工具,也引入了一种全新的思考和解决问题的方式。本文将深入探讨这三个概念,并分析它们如何在Java编程语言中得以实现和...

    【独家】【笔面试题库】11.抽象类与封装1

    在面向对象编程(Object-Oriented Programming, OOP)中,抽象和封装是两个核心概念,它们对于构建灵活、可维护的软件系统至关重要。这里我们将深入探讨这两个概念及其在实际编程中的应用。 **抽象** 是一种设计...

    Nohttp封装,soap封装

    它不仅提供了实际的代码示例,还展示了如何将复杂的网络操作进行抽象和封装,使得代码更加整洁和模块化。通过阅读和实践这个项目,开发者可以深入理解网络请求库的使用,以及SOAP协议在Android中的实现,提升自己的...

    实验三 抽象与封装.docx

    - **抽象与封装**:学习如何通过抽象类或接口定义通用行为和属性,以及如何通过封装隐藏对象内部的具体实现细节,只暴露必要的公共方法。 - **类与对象**:理解类作为对象的蓝图,能够创建具有相同特性的多个实例...

    json_value20190219.zip_RapidJson 简单封装_json封装_rapidjson_rapidjson

    在IT行业中,JSON(JavaScript Object Notation)是一种广泛使用的轻量级数据交换格式,它...不过,这种封装体现了C++社区的一个普遍趋势,即通过创建易于使用的接口来抽象和封装底层复杂性,以提升开发者的生产力。

    Java基础知识:接口和抽象类

    在 Java 编程中,接口和抽象类是两个重要的概念,它们都用于实现面向对象编程中的抽象和封装,但在使用方式和功能上有所不同。 1. 接口(Interface) 接口是一种抽象的数据类型,它定义了一组方法的规范,但没有...

    对于C#(HttpClient)方式网络请求的封装

    标题中的“对于C#(HttpClient)方式网络请求的封装”是指使用C#编程语言,特别是通过HttpClient类来处理HTTP网络请求,并将这个过程进行抽象和封装,以便在多个地方重复使用。HttpClient是.NET Framework和.NET ...

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

    在`da06抽象继承封装多态接口.zip`的案例中,开发者可能创建了一系列的类,通过这些类展示了Flutter中如何使用抽象、继承、封装和多态来设计和组织代码。通过运行Test文件,我们可以验证和理解这些概念在实际应用中...

    mysql C++封装类

    它将MySQL的C API进行抽象和封装,提供了一套更符合C++编程习惯的接口,简化了数据库操作,使得代码更加简洁易读。在这个压缩包中,有两个文件:`www.pudn.com.txt`可能是下载来源或相关说明文档,而`mysql封装类`...

    snmp设备的agent(代理)端的仿真程序,对设备特性进行抽象封装

    SNMP代理是设备特性抽象和封装的核心。它的工作原理如下: 1. **抽象化设备特性**:SNMP代理将设备的各种硬件和软件特性,如CPU利用率、内存使用情况、接口状态、存储容量等,转化为统一的MIB(管理信息库)结构。...

    ios-AF数据请求封装.zip

    在“ios-AF数据请求封装”中,开发者对AFNetworking进行了进一步的抽象和封装,以适应项目需求,提高了代码的可复用性和可维护性。封装通常包括以下几个方面: 1. 请求参数的处理:封装可能提供了一个统一的方式...

    ADO封装类

    这个"ADO封装类"是将ADO的一些基本操作进行抽象和封装,以简化代码,提高开发效率。 封装类的主要优点在于它隐藏了复杂的ADO API细节,让开发者能够通过更简洁、直观的方式进行数据库交互。下面我们将深入探讨ADO...

    JDBC操作 简单封装

    在Java编程中,JDBC(Java Database Connectivity)是Java应用程序与各种数据库进行...通过对数据库连接、SQL执行、结果集处理等环节进行抽象和封装,开发者可以更便捷地与数据库进行交互,同时保持代码的整洁和高效。

Global site tag (gtag.js) - Google Analytics