当前位置: 首页 > news >正文

Java设计原则

面向对象经典设计原则主要包括单一职责原则、开放封闭原则、里氏替换原则、依赖倒置原则、接口隔离原则,文本主要从JAVA面向对象程序设计语言类的基本特性(封装、继承、多态)、JDK的API设计三个方面描述这些原则的基本原理。

单一职责原则

该原则体现出的类设计思想包括高内聚、低耦合,一般情况下,高内聚与低耦合是同时出现的,一个高内聚的类说明很少依赖或者不依赖其他类、只依赖自身设计的方法实现该类的全部功能,因此,一个高内聚的类很少与其他类发生耦合的关系

图片

如上所示,从功能模块划分的角度看,Java的包定义也具备单一职责的性质,一个Java类包中只包括具备同一类别功能与职责的类,Java类包的命名也体现出现该类的功能与职责,JDK将所有与文件系统的输入输出流的操作相关的类都集中在io的类包中

图片

图片

图片

如上所示,JDK提供的String类是一个专注于字符串处理的类,具备单一职责的性质,该类的写操作只存在于构造函数,不提供其他写方法修改该类的字符串内容,提供大量的读方法处理原始字符串并输出新的字符串内容

开放封闭原则

从软件设计的角度看,每个功能模块都需要支持可扩展性以及可重用性,而一个类具备开放性是指该类支持可扩展性,即一个类可以在不被修改的情况下提供可扩展的能力,一个类具备封闭性是指该类不提供被修改的能力,因为,一个类一旦被修改,则该类失去了可重用性,在面向对象设计与编程思想中,可以使用继承、多态、重写、重载的特性实现类的可扩展性

图片

图片

如上所示,集合类继承了抽象类,实现类的可扩展性,抽象类集成了集合的通用属性与方法,不同集合类可以继承相同的抽象类扩展适合自身的功能特性,因此,抽象类具备封闭性,而不同集合类具备开放性

图片

如上所示,开发者可以使用类继承的扩展特性自定义一个排序的集合类,实现适合自身的集合工具类

图片

图片

图片

如上所示,开发者可以使用接口多态性扩展自定义一个排序接口,实现适合自身的集合排序类

图片

图片

如上所示,开发者可以根据实际的不同业务场景,使用类继承的特性扩展与重载不同的排序方法,而不用修改已有的类,因而,既能保留已有类的可重用性,又能保证新业务场景中的类可扩展性

图片

如上所示,开发者也可以根据实际的不同业务场景,重载已有的函数,修改已有函数的参数类型或者参数个数,从而实现类的可扩展性

里氏替换原则

面向对象编程设计思想中,类的定义与扩展一般符合两个原则,即向上层抽象以及向下层扩展,因此,在不需要类型转换的情况下,下层对象可以合理地替换上层对象,因为下层对象包括了上层对象定义的方法,但是,在需要类型转换的情况下,上层对象替换下层对象则有可能出错,因为上层对象不一定支持下层对象定义的扩展方法

图片

如上所示,定义排序方法的输入参数中,包括上层接口类型、上层抽象类型,在对象调用以及参数传递时,下层对象实例可以替换上层抽象类型,但是,上层对象实例需要向下层转换类型才能替换下层的扩展类型

依赖倒置原则

依赖倒置原则类似于里氏替换原则,即下层扩展类型应依赖上层抽象类型、具体依赖于抽象,从类的继承体系的角度看,由上层抽象类型向下层扩展类型实现扩展,但是,从类的依赖关系的角度看,由下层扩展类型向上层抽象类型实现依赖,扩展与依赖的方向刚好相反,从而形成倒置的关系

图片

图片

图片

如上所示,定义抽象类、定义抽象方法,在同一层的抽象类中具体方法依赖调用抽象方法,该抽象方法由下层的扩展类型具体实现

接口隔离原则

面向对象编程设计思想中,接口用于实现多态性,即一个类可以实现多个不同的接口、一个接口可以由多个不同的类实现

图片

图片

如上所示,抽象排序类实现多个不同的排序接口,每个排序的接口提供不同的方法

图片

如上所示,使用不同的接口实现不同的排序算法功能,在依赖调用时可以实现接口功能隔离的原则

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Mybatis 和 数据库连接
  • Java中的异步编程模式:CompletableFuture与Reactive Programming的实战
  • TIOBE 编程指数 9 月排行榜公布 VB.Net第七
  • 【深度学习】(3)--损失函数
  • Numpy
  • Java后端性能监控:使用JMX与Java Mission Control的深入解析
  • ppt一键生成免费版软件有哪些?如何高效生成论文答辩?
  • Rust: AES 加密算法库
  • Springboot请求响应案例
  • Axure RP 9最新安装程序及汉化包下载(支持Win、Mac版,附下载安装教程)
  • 游戏如何对抗定制挂
  • MATLAB矩阵下标引用
  • C语言中的一些小知识(二)
  • 【C#】vs2022 .net8
  • 分布式事务学习笔记(二)Seata架构、TC服务器部署、微服务集成Seata
  • 深入了解以太坊
  • #Java异常处理
  • [译] 怎样写一个基础的编译器
  • 【347天】每日项目总结系列085(2018.01.18)
  • canvas 绘制双线技巧
  • ES学习笔记(12)--Symbol
  • Java 网络编程(2):UDP 的使用
  • MySQL几个简单SQL的优化
  • Shell编程
  • windows下mongoDB的环境配置
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 读懂package.json -- 依赖管理
  • 和 || 运算
  • 码农张的Bug人生 - 初来乍到
  • 通信类
  • 物联网链路协议
  • 携程小程序初体验
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • #HarmonyOS:基础语法
  • #QT项目实战(天气预报)
  • %check_box% in rails :coditions={:has_many , :through}
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (¥1011)-(一千零一拾一元整)输出
  • (175)FPGA门控时钟技术
  • (2)STL算法之元素计数
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (力扣)1314.矩阵区域和
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)Android学习笔记 --- android任务栈和启动模式
  • *2 echo、printf、mkdir命令的应用
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .Net 高效开发之不可错过的实用工具
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .Net组件程序设计之线程、并发管理(一)