Java 设计模式 Day3 之面向抽象原则:什么是面向抽象编程?面向抽象编程如何应用?

文章目录

  • 前言
  • 一、什么是面向抽象编程?
  • 二、传统场景的类设计
    • 2.1、项目场景设计
    • 2.2、传统类设计存在的问题
  • 三、采用面向抽象编程的类设计
    • 3.1、设计一个抽象类/接口
    • 3.2、采用上转型对象/接口回调调用子类方法
    • 3.3、重新设计子类/被实现类
    • 3.4、面向抽象编程的具体实现
  • 四、面向抽象编程的优势
  • 总结


前言

面向抽象原则是面向对象四大基本原则的第一条,其重要性不言而喻,面向抽象原则分为抽象类、接口以及面向抽象编程,在之前的内容中我们详细介绍了抽象类与接口,并对二者进行了对比,在本文中我们将详细介绍什么是面向抽象编程,它与传统编程相比有什么优势?在开发中又该如何切实应用。

在这里插入图片描述


一、什么是面向抽象编程?

面向抽象编程就是在设计一个类时,不让该类面向具体的类,而是面向抽象类或接口,即所设计的类中的重要数据是抽象类或接口声明的变量,而不是具体类声明的变量

下面我们将在具体的案例中进一步分析传统类设计与面向抽象编程的类设计的区别。

二、传统场景的类设计

在探讨面向抽象编程之前,先看一下我们常规对于一个类的设计是什么样的。

2.1、项目场景设计

项目场景:现在我们需要求一个圆柱体的体积,需要创建两个类,圆类 Circle 和圆柱体类 Pillar。

首先我们创建一个 Circle 类,该类创建的对象 circle 调用 getArea() 方法可以计算出圆的面积,Circle 类的代码如下:

package com.bailu.principle;public class Circle {final double PI = 3.14159;// 定义一个常量double r;/** 定义一个无参构造*/Circle() {}Circle(double r) {this.r = r;}public double getArea() {return (PI * r * r);}
}

接着我们再设计一个圆柱类 Pillar,该类创建的对象 pillar 调用 getVolume() 方法可以计算圆柱体的体积,Pillar 类的代码如下:

package com.bailu.principle;public class Pillar {Circle bottom;// 将Circle类声明的对象作为成员,圆柱体的底double height;/** 定义一个无参构造*/Pillar() {}Pillar(Circle bottom, double height) {this.bottom = bottom;this.height = height;}public double getVolume() {return bottom.getArea() * height;}
}

2.2、传统类设计存在的问题

在上面的圆柱体类 Pillar 中,bottom 是用具体类 Circle 声明的变量,如果在实际开发中不涉及用户需要的变化,这样设计并没有什么不妥,但是某些时候,如果用户希望将圆柱体改为三菱柱。显然 Pillar 类是无法满足的,并不能满足用户的需求

那我们就需要对 Pillar 类进行修改。对于需要我们需要明确,柱体计算体积关键点在于计算底面积。我们不应该关心它的底具体是什么样的形状,而应该关心是否有计算面积的方法。

即我们在设计类的时候不应该将柱体的底看做某个具体类声明的变量,我们上面这样做,Pillar 类太过于依赖具体类,缺乏弹性,难以应对需求的变化

三、采用面向抽象编程的类设计

3.1、设计一个抽象类/接口

如果我们采用面向抽象编程重新进行设计,首先需要设计一个抽象类用来获取柱体底面积,该抽象类(或接口)我们定义为 Geometry(),我们在其中定义一个 getArea() 的抽象方法,具体代码如下:

package com.bailu.principle;public abstract class Geometry {// 如果使用的是接口,用interface定义即可public abstract double getArea();
}

现在我们就可以面向 Geometry 类进行编码,即通过上转型对象/接口回调的方式,调用 Geometry 子类重写的 getArea() 方法,这样 Pillar 类就可以将计算柱体底面积的任务指派给 Geometry 子类的实例

3.2、采用上转型对象/接口回调调用子类方法

现在我们重新设计 Pillar 类不再依赖具体类,而是面向我们创建的抽象类/接口 Geometry,即 bottom 不再是具体类 Circle 声明的变量,重新设计后 Pillar 类代码如下:

package com.bailu.principle;public class Pillar {Geometry bottom;// bottom是抽象类Geometry声明的变量double height;/** 定义一个无参构造*/Pillar() {}Pillar(Geometry bottom, double height) {this.bottom = bottom;this.height = height;}public double getVolume() {return bottom.getArea() * height;// bottom可以调用子类重写的getArea()方法}
}

3.3、重新设计子类/被实现类

在采用面向抽象编程之后,我们就可以根据客户需求对柱体要求的不同底进行设计。如圆形底和矩形底,我们创建抽象类 Geometry 的子类 Circle 和 Rectangle,重写 Geometry 类的抽象方法 getArea()计算各自面积。

Circle 类对应代码如下:

package com.bailu.principle;/** 当柱体的底为圆时*/
public class Circle extends Geometry {final double PI = 3.14159;// 定义一个常量double r;/** 定义一个无参构造*/Circle() {}Circle(double r) {this.r = r;}@Overridepublic double getArea() {return (PI * r * r);}
}

Rectangle 类对应代码如下:

package com.bailu.principle;/** 当柱体的底为矩形时*/
public class Rectangle extends Geometry {double a, b;// 定义矩形的长宽/** 创建一个无参构造*/Rectangle() {}Rectangle(double a, double b) {this.a = a;this.b = b;}@Overridepublic double getArea() {return a * b;}
}

3.4、面向抽象编程的具体实现

现在我们就可以使用 Pillar 类创建出不同形状底的柱体了,实现代码如下:

package com.bailu.principle;public class ApplicationPillar {public static void main(String[] args) {Pillar pillar;Geometry bottom;bottom = new Rectangle(2, 3);// 抽象类的实例作为Rectangle类的上转型对象pillar = new Pillar(bottom, 3);System.out.println("矩形底柱体体积为: " + pillar.getVolume());bottom = new Circle(2);// 抽象类的实例作为Circle类的上转型对象pillar = new Pillar(bottom,2);System.out.println("圆底柱体体积为: " + pillar.getVolume());}
}

运行结果具体如下图所示:

在这里插入图片描述

四、面向抽象编程的优势

通过上面的案例我们可以发现,采用面向编程来设计 Pillar 类,使得 Pillar 类不再依赖于具体的某个类(Circle 类、Rectangle 类),当我们有新的需求增加时,我们只需要增加 Geometry 的子类即可,如增加一个三角形底的子类 Triangle,并不需要修改 Pillar 类的任何代码就可以创建出三角形底的柱体


总结

在本文给大家介绍了什么是面向抽象编程,并通过与传统类设计的对比使大家明确面向抽象编程的优势,设计一个类时,不让该类面向具体的类,而是面向抽象类或接口,即所设计的类中的重要数据是抽象类或接口声明的变量,而不是具体类声明的变量,这样就算需求发生变化,我们只需要增加或修改抽象类子类内容即可,而无需修改其他代码。

在这里插入图片描述


我是白鹿,一个不懈奋斗的程序猿。望本文能对你有所裨益,欢迎大家的一键三连!若有其他问题、建议或者补充可以留言在文章下方,感谢大家的支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/530667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

赢在 CSDN:我在 CSDN 的成长,“长风破浪会有时”,如何保证自己有持续写作的动力?

文章目录前言一、如何结缘 CSDN?1.1、我的“黑客之路”初探1.2、CSDN 一眼看得到的优势是什么?1.3、大学再遇 CSDN二、为什么开始在 C 站输出内容?2.1、“好记性不如烂笔头”2.2、记事本到“鼓励工具”三、C 站吸引我的地方是什么?3.1、海量…

华为工业云平台:制造业企业数据平台建设最佳实践分享

文章目录前言一、制造行业数字化转型和发展趋势1.1、制造行业数字化转型发展趋势1.2、制造行业数字化转型遇到的挑战1.3、政策牵引,加快数字化转型升级二、数字化转型-业务角度2.1、智能生产2.2、智能销售2.3、智能物流2.4、智能供应链2.5、智慧决策三、数字化转型-…

计算机本科毕业设计:毕业设计、论文要点及我们面对毕业答辩应持有的态度

文章目录前言一、对于毕业设计1.1、选题1.2、中期自查1.3、毕业设计答辩二、对于毕业论文三、我们应持有的态度3.1、人尽其才3.2、恪尽职守3.3、全力以赴3.4、做好自己总结前言 最近不断有很多学弟、学妹来找我咨询一些关于毕设、论文答辩的问题,一看日历四月份了&a…

Eclipse 答疑:Eclipse 使用 Amateras UML 创建类图点击 Finish 没反应解决方式汇总

文章目录前言一、问题产生场景1.1、Amateras UML 创建类图没反应二、问题原因分析三、问题定位及解决3.1、定位检查版本支持信息3.2、问题确认过程3.3、解决方式验证四、不想降低版本怎么办?总结前言 之前项目中在 Eclipse 使用 Amateras UML 创建类图点击 Finish 没…

DDoS 攻击与防护(二):DDoS 防护购买和使用入门指南,DDoS 防护服务有哪些应用场景?

文章目录前言一、如何选择 DDoS 高防和 DDoS 原生高级防护?二、如何购买和使用 DDoS 高防?2.1、购买 DDoS 高防2.2、DDoS 高防域名网站类业务接入流程2.3、配置防护域名2.4、上传证书2.5、选择实例和线路2.6、本地验证2.7、修改 DNS 解析2.8、放行高防回…

Java 大厂面试必刷题 Day1:何为面向对象编程的思想?面向对象三大特征是什么?

文章目录 前言一、何为面向对象编程的思想?二、面向对象的三大特征2.1、封装关系2.2、继承关系2.3、多态关系总结前言 从本文我们将开始《Java 大厂面试必刷题》系列的更新,Java 面试必刷题 Day1:何为面向对象编程的思想?面向对象三大特征是什么?这道题对于 Java 从业者来…

猿创征文|2022 互联网从业心得:“但愿人长久,千里共婵娟”,中秋先学会与自己内心团圆

文章目录前言一、“好雨知时节,当春乃发生”1.1、《性格修正:如何突破你的原生性格》1.2、“疼我孰知父母”1.3、“海内存知己,天涯若比邻”二、“读万卷书,行万里路”2.1、“读万卷书”2.2、“行万里路”三、“身体是革命的本钱”…

猿创征文|弹性云服务器 ECS:轻松上云第一步,如何根据应用场景购买和使用入门 ECS?

文章目录前言一、什么是弹性云服务器?1.1、ECS 介绍1.2、为什么选择 ECS?1.3、ECS 产品架构1.4、ECS 产品优势二、弹性云服务器的实例类型三、弹性云服务器的购买3.1、基础配置3.1.1、计费模式3.1.2、区域3.1.3、可用区3.1.4、CPU 架构3.1.5、规格3.1.6、…

猿创征文|不会代码也能玩开发?基于华为云 IoT 快速实现 0 代码体验物联网设备上云

文章目录前言一、物联网设备上云背景介绍二、实验环境准备三、智慧烟感器上云体验3.1、选择向导式极速体验3.2、对智慧烟感器进行产品定义3.3、定义目标设备标识码、注册设备3.4、根据需要选择设备演示包3.5、下载、解压设备演示包3.6、执行 bat 文件,运行设备演示包…

猿创征文|基于 AppCube 应用魔方:零代码手把手教你 5 分钟开发微信小程序

文章目录前言一、AppCube 应用魔方1.1、什么是 AppCube 应用魔方?1.2、为什么选择AppCube 应用魔方?二、项目实验环境与资源准备2.1、实验需求及环境介绍2.2、初次订购 AppCube2.3、曾订购过 AppCube三、进入 AppCube 全新零代码界面四、配置业务用户信息…

《软件质量保证与测试》第 6 章——系统测试 重点部分总结

文章目录 前言一、判断题二、简答题总结前言 软件质量保证是建立一套有计划,有系统的方法,来向管理层保证拟定出的标准、步骤、实践和方法能够正确地被所有项目所采用。软件测试是使用人工或自动的手段来运行或测定某个软件系统的过程,其目的在于检验它是否满足规定的需求或…

《软件质量保证与测试》第 9 章——测试自动化及其框架 重点部分总结

文章目录 前言一、判断题二、简答题总结前言 软件质量保证是建立一套有计划,有系统的方法,来向管理层保证拟定出的标准、步骤、实践和方法能够正确地被所有项目所采用。软件测试是使用人工或自动的手段来运行或测定某个软件系统的过程,其目的在于检验它是否满足规定的需求或…

java中间件是什么意思_数据库中间件漫谈

1.前言随着业务的发展,MySQL数据库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作的开销也会越来越大;另外,无论怎样升级硬件资源,单台服务器的资源(CPU、磁盘、内存、…

kafka多个消费者消费一个topic_kafka:一文读懂消费者背后的那点quot;猫腻quot;

来自:z小赵前言经过前几篇文章的介绍,大致了解了生产者背后的运行原理。消息有生产就得有人去消费,今天我们就来介绍下消费端消费消息背后发生的那点事儿。文章概览消费者与消费组的“父子关系”。Repartition 触发时机。消费者与 ZK 的关系。…

MySQL 入门教程:初学者一学就会,零基础 MySQL 安装及增删改查入门

文章目录前言一、MySQL 的相关概念介绍二、Windows 下 MySQL 的配置2.1、MySQL 安装配置步骤2.2、MySQL 服务的启动、停止与卸载三、MySQL 脚本的基本组成四、MySQL 中的数据类型4.1、数字类型4.2、日期和时间4.3、字符串类型五、使用 MySQL 数据库5.1、登录到 MySQL5.2、创建一…

四大基本反应类型的关系_如何进入四大的咨询部门?

在会计行业,人人梦寐以求的职位,莫过于四大的财务咨询的岗位,第一咨询工作很高大上,第二没有其他职位那么幸苦,我从我的工作经历来讲讲,我是怎么进入咨询这个“真香”岗位的。首先,给大家说一个…

MySQL 异常:这一篇就够了,MySQL 抛出异常的几种常见解决方式小结

Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: Connections could not be acquired from the underlying database! 几种解决方式小结 文章目录Could not open JDBC Connection for transaction; nested exception is java.sql…

vnc用户名 查看linux_vnc用户名未被识别,5步教你如何解决vnc用户名未被识别

在进行vnc使用时,很多小伙伴会出现用户名未被识别的情况,那如何解决vnc用户名未被识别呢?咱接着往下看。使用工具:IIS7服务器管理工具主程序界面图:官网地址:IIS7服务器管理工具作为IIS7服务器管理工具&…

IntelliJ IDEA 乱码:全网最全 4 种方法完美解决 IntelliJ IDEA 控制台中文乱码问题

文章目录前言一、修改当前 Web 项目 Tomcat Server 的虚拟机输出选项二、修改 IntelliJ IDEA 全局编码、项目编码、属性文件编码三、IntelliJ IDEA 中自定义虚拟机选项四、直接修改 IntelliJ IDEA 配置文件的编码信息五、修改成功乱码问题解决总结前言 IntelliJ IDEA 如果不进行…

JVM 调优 1:“精通 JVM 调优,有过 JVM 调优经验”简历敢写吗?薪资涨 5k 的技巧

文章目录前言一、部分大厂对于 JVM GC 的面试题1.1、百度1.2、顺丰1.3、京东1.4、淘宝1.5、阿里、蘑菇街二、Garbage Collectors(GC)作何使用三、GC 的十种类型四、JVM 的版本参数信息4.1、查看 Java 启动时所有默认的命令行参数4.2、查看 Java 启动时 G…