Java设计原则之单一职责原则、开闭原则、里氏代换原则

news2024/11/17 9:28:29

文章目录

面向对象设计原则概述

单一职责原则

 开闭原则

 里氏代换原则


面向对象设计原则概述

        软件的可维护性(Maintainability)和可复用性(Reusability)是两个非常重要的用于衡量软件质量的属性,软件的可维护性是指软件能够被理解、改正、适应及拓展的难易程度,软件的可复用性是指软件能够被重复使用的难易程度

        面向对象的设计目标之一在于支持可维护性复用,一方面需要实现设计方案或者源代码的复用,另一方面确保系统能够易于拓展与修改,具备良好的可维护性。

        面向对象设计原则也是后续学习设计模式的基础,某一个设计模式都符合某一个或者多个面向对象的设计原则。

7个常用的面向对象设计原则

单一职责原则

概述

        单一职责原则是最简单的面向对象的设计原则,它用于控制类的粒度大小,其定义如下:一个对象应该只包含单一的职责,并且该职责被单一地封装在一个类中。另一种定义是:就一个类而言,应该仅有一个引起它变化的原因

        在软件系统中,一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性就越小,而且一个类承担的职责过多,相当于将这些职责耦合在一起,当其中一个职责变化时可能会影响其他职责的运作,因此要将这些职责进行分离,将不同的职责封装在不同的类中,即将不同的变化原因封装在不同的类中,如果多个职责总是同时发生改变则可将它们封装在同一类中。

        单一职责原则是实现高内聚、低耦合的指导方针,它是最简单但又是最难运用的原则。

示例

这个设计原则最简单也很容易理解,故省略示例代码。


 开闭原则

概述

         开闭原则是面向对象的可复用设计的第一块基石,它是最重要的面向对象的设计原则。

开闭原则的定义是:软件实体应当对拓展开放,对修改关闭。通俗地来说,开闭原则就是指在软件实体尽量在不修改原有代码的情况下进行拓展。

        为了满足开闭原则,需要对系统进行抽象化的设计,抽象化是开闭原则的关键。在很多面向对象的语言中都提供了接口、抽象类等机制,可以通过它们来定义系统的抽象层,再通过具体类来进行拓展。如果有新的业务需求,只需要增加新的具体类来实现新的业务功能,不需要变动抽象层,这样就达到了在不修改原来代码的前提下拓展系统的功能,达到开闭原则的要求。

 示例

代码

AbstractSkin.java
package com.Demo.Principles.开闭原则;
/**
 * 抽象皮肤类
 */
public abstract class AbstractSkin {
    //用于显示
    public abstract void display();
}
DefaultSkin.java
package com.Demo.Principles.开闭原则;

public class DefaultSkin extends AbstractSkin{
    @Override
    public void display() {
        System.out.println("这是默认皮肤...");
    }
}
HeimaSkin.java
package com.Demo.Principles.开闭原则;

public class HeimaSkin extends AbstractSkin{
    @Override
    public void display() {
        System.out.println("这是黑马皮肤...");
    }
}
SogoInput.java

        该类实现聚合关系,将抽象皮肤类与具体的皮肤类进行聚合,后者与前者属于部分与整体的关系。

package com.Demo.Principles.开闭原则;

/**
 * 聚合关系:搜狗输入法类
 */
public class SogoInput {
    private AbstractSkin skin;
    //传入皮肤类
    public void setSkin(AbstractSkin skin){
        this.skin=skin;
    }
    //调用当前皮肤的显示输出的方法
    public void display(){
        skin.display();
    }
}

 测试已有皮肤对象

 此时,如果有了一个新的业务需求,要求增加一个王者皮肤,只需要增加一个新的具体皮肤类继承抽象的皮肤类,实现其所有方法,达到了“开闭原则”。

KingSkin.java

和前面的具体皮肤类写法一致,进行业务的拓展,无需修改原有的任何代码

package com.Demo.Principles.开闭原则;

public class KingSkin extends AbstractSkin{
    @Override
    public void display() {
        System.out.println("这是王者皮肤...");
    }
}

测试新增加的皮肤

这就是开闭原则的简单运用,不修改原代码实现业务功能的拓展,对拓展开放,对修改关闭


 里氏代换原则

概述

         里氏代换原则是指:所有引用基类(父类)的地方必须能够透明地使用其子类的对象

通俗理解就是,子类可以拓展父类的功能,但不能改变父类原有的功能。

        换句话说,子类继承父类时,除了添加新的方法完成新的业务功能之外,尽量不要去重写父类的方法,否则会导致整个继承体系的可复用性变差

里氏代换原则表明:

  • 在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常
  • 反之则不成立,如果一个软件实体使用的是一个子类对象,那么它不一定能使用基类对象

 因此,我们在软件设计时:

  • 在程序中尽量使用基类类型来定义对象,因为在使用基类对象的地方一定可以使用其子类对象;而在运行时再确定其子类类型,用子类对象来替换父类对象
  • 在使用该原则时,应该将基类,即父类设计成抽象类或者接口,让子类继承父类或者实现父类的接口,并实现在父类中声明的方法,在运行时子类实例替换父类实例,可以很方便的拓展系统的功能,无需修改原有的子类的代码,增加新的功能可以通过增加一个新的子类来实现

END.

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

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

相关文章

Ubuntu常用命令总结

目录 1)安装包命令及下载包命令 2)阅读协议内容 3)执行sh文件: 4)创建虚拟环境 5)激活虚拟环境 6)虚拟环境中安装包 7)安装上传代码工具 8)代码上传 9&#xff09…

传输控制协议(TCP)知识点总结

文章目录 传输控制协议(TCP)知识点总结介绍数据包格式TCP连接的建立和关闭三次握手四次挥手一张图展示这些过程 其他知识 传输控制协议(TCP)知识点总结 维基百科: 传输控制协议(TCP)是Internet协议套件中的主要协议之一。它起源于…

五种最危险的新兴网络攻击技术

SANS研究所的网络专家揭示了包括网络罪犯和民族国家行为者在内的网络攻击者正在使用的五种最危险的新兴网络攻击技术。在旧金山举行的RSA网络安全会议上,由SANS研究所的几位分析师组成的讨论组讨论了新兴的网络攻击战术、技术和程序,并提供了如何为企业做…

使用GLSL来实现实时滤镜的效果

1. 先来明确几个概念 1.1 OpenGL OpenGL 全称为 Open Graphics Library(开放图形库)。 是用于渲染 2D 或 3D 图像的跨语言跨平台的应用程序编程接口,用于CPU控制GPU做图像渲染,是一套API。 提供设计人员一个共同的硬件驱动标准…

虚函数、静态绑定和动态绑定

静态绑定 class Base { public:Base(int data) :ma(data) {}void show() { cout << "Base::show()" << endl; }void show(int) { cout << "Base::show(int)" << endl; }protected:int ma; };class Derive : public Base { public…

Go | 一分钟掌握Go | 10 - 反射

作者&#xff1a;Mars酱 声明&#xff1a;本文章由Mars酱编写&#xff0c;部分内容来源于网络&#xff0c;如有疑问请联系本人。 转载&#xff1a;欢迎转载&#xff0c;转载前先请联系我&#xff01; 前言 反射你以为只在Java中有吗&#xff1f;Go也有反射机制&#xff0c;很多…

【JavaEE】应用层自定义协议及UDP协议

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 本篇文章将为大家介绍应用层中UDP协议~~ 在应用层这里&#xff0c;虽然存在一些现有的协议&#xff08;HTTP&#xff09;&#xff0c;但是也有很多情况&#xff0c;需要程序猿自定制协议&a…

OJ 功能介绍 使用手册

目录 服务器配置 OJ界面展示 用户管理 一、批量导入&#xff08;从方便管理角度建议以 学生姓名 作为 用户名 &#xff09; 二、批量生成临时用户 后期修改成需要的用户名和密码 &#xff08;学生登录后修改密码&#xff09; 三、用户自行注册&#xff08;填写邮箱获取验证码…

Nmap入门到高级【第九章】

预计更新Nmap基础知识 1.1 Nmap简介和历史 1.2 Nmap安装和使用方法 1.3 Nmap扫描技术和扫描选项 Nmap扫描技术 2.1 端口扫描技术 2.2 操作系统检测技术 2.3 服务和应用程序检测技术 2.4 漏洞检测技术 Nmap扫描选项 3.1 扫描类型选项 3.2 过滤器选项 3.3 探测选项 3.4 输出选项…

【致敬未来的攻城狮计划】— 连续打卡第二十天:RA2E1_UART —— 串口通信例程

系列文章目录 1.连续打卡第一天&#xff1a;提前对CPK_RA2E1是瑞萨RA系列开发板的初体验&#xff0c;了解一下 2.开发环境的选择和调试&#xff08;从零开始&#xff0c;加油&#xff09; 3.欲速则不达&#xff0c;今天是对RA2E1 基础知识的补充学习。 4.e2 studio 使用教程 5.…

Docker consul服务注册与发现

目录 一、服务注册与发现 1、什么是服务注册与发现 2、什么是consul 3、consul提供的一些关键特性 4、容器更新与发现 二、基于nginx与consul构建自动发现即高可用的Docker服务架构 consul服务器部署 1、建立consul 2、查看集群信息 3、通过http获取集群信息 regist…

SpringBoot+vue文件上传下载预览分片上传

学习链接 Blob & File 上传文件 前台 整个过程&#xff0c;就是在使用FormData 添加 上File&#xff08;这个Blob&#xff09;&#xff0c;并且key要和后台的名字对应上在点击上传按钮开始上传之前&#xff0c;使用了URL.createObjectURL(File)创建blobUrl&#xff0c;…

MySQL数据库之库表管理

一、常用的数据类型&#xff1a; 类型含义tinyint(n)1个字节&#xff0c;范围(-128~127)smallint(n)2个字节&#xff0c;范围(-32768~32767)mediumint(n)3个字节&#xff0c;范围(-8388608~8388607)int(n)4个字节(32个比特位)&#xff0c;整数型&#xff0c;范围(-2147483648~…

JavaEE - 网络编程

一、网络编程基础 为什么需要网络编程&#xff1f; 用户在浏览器中&#xff0c;打开在线视频网站&#xff0c;如优酷看视频&#xff0c;实质是通过网络&#xff0c;获取到网络上的一个视频资源。 与本地打开视频文件类似&#xff0c;只是视频文件这个资源的来源是网络。 相比本…

KALI入门到高级【第五章】

预计更新第一章 入门 1.1 什么是Kali Linux&#xff1f; 1.2 安装Kali Linux 1.3 Kali Linux桌面环境介绍 1.4 基本命令和工具 第二章 信息收集 1.1 网络扫描 1.2 端口扫描 1.3 漏洞扫描 1.4 社交工程学 第三章 攻击和渗透测试 1.1 密码破解 1.2 暴力破解 1.3 漏洞利用 1.4 特…

模糊PID(模糊规则表)

模糊PID的模糊化相关内容,请参看下面的博客文章: PLC模糊控制模糊PID(梯形图实现+算法分析)_RXXW_Dor的博客-CSDN博客博途PLC的模糊PID控制详细内容请查看下面的博客文章:Matlab仿真+博途PLC模糊PID控制完整SCL源代码参考(带模糊和普通PID切换功能)_博途怎么实现模糊pid_…

后端程序员的前端必备【Vue】 - 05 class与style绑定、表单输入绑定、Vue生命周期

class与style绑定、表单输入绑定、Vue生命周期 1 class与style绑定1.1 绑定class1.2 绑定style1.3 练习 2 表单输入绑定3 Vue生命周期3.1 vue生命周期3.2 组件的生命周期钩子 1 class与style绑定 操作元素的 class 列表和内联样式是数据绑定的一个常见需求。因为它们都是 attri…

【操作系统】操作系统内核

图灵机 当系统中有一个CPU的时候 &#xff0c;MR就是它的状态 当系统中有n个CPU的时候&#xff0c;MR1,MR2…MRn 是它的状态 IRQ和NMI是低电平有效信号 NMI不可屏蔽中断 6502的CPU一共40个引脚 eflags寄存器里的 IF 表示 interrupt enable 1表示可以响应中断&#xff0c;0表示…

破解马赛克有多「容易」?

刷短视频时&#xff0c;估计大家都看过下面这类视频&#xff0c;各家营销号争相曝光「一分钟解码苹果笔刷背后内容」的秘密。换汤不换药&#xff0c;自媒体们戏称其为「破解马赛克」&#xff0c;殊不知让多少不明真相的用户建立起了错误的认知&#xff0c;也让苹果笔刷第 10086…

【网络编程】demo版UDP网络服务器实现

文章目录 一、引入二、服务端实现2.1 创建套接字socket2.2 绑定bind2.3 启动服务器2.4 IP的绑定2.5 读取数据recvfrom 三、用户端实现3.1 绑定问题3.2 发送数据sendto 四、源码 一、引入 在上一章【网络编程】socket套接字中我们讲述了TCP/UDP协议&#xff0c;这一篇就是简单实…