首页 > 编程语言 >Java笔记(六):设计原则

Java笔记(六):设计原则

时间:2023-04-08 14:47:04浏览次数:35  
标签:应该 Java 原则 子类 代码 接口 笔记 父类

SOLID原则是面向对象设计和编程中的一组基本原则,其中SOLID分别是以下五个原则的首字母缩写:

  • 单一职责原则(Single Responsibility Principle,SRP)。一个类或者模块只应该有一个单一的责任。这个原则告诉我们,一个类应该只负责一项功能,不要试图把太多的职责塞到一个类里面。

  • 开闭原则(Open Closed Principle,OCP)。软件应该对扩展开放,对修改关闭。这个原则告诉我们,我们应该尽量通过扩展来实现新的功能,而不是去修改已经存在的代码。

  • 里氏替换原则(Liskov Substitution Principle,LSP)。子类可以被看作是父类的一种类型,即父类能出现的地方子类也能够出现。这个原则告诉我们,在使用继承时,子类不能改变父类原有的行为,否则会导致程序出现意想不到的问题。

  • 接口隔离原则(Interface Segregation Principle,ISP)。客户端不应该依赖于它不需要的接口。这个原则告诉我们,在设计接口时,应该尽量将接口拆分成更小粒度的接口,避免接口的臃肿和复杂度的增加。

  • 依赖倒置原则(Dependency Inversion Principle,DIP)。高层模块不应该依赖低层模块,二者都应该依赖其抽象。这个原则告诉我们,在设计类和模块之间的关系时,应该通过抽象来实现低耦合、高内聚的设计。

开闭原则

开闭原则是指软件设计中的一个基本原则,它强调"软件实体(类、模块、函数等)应该对扩展开放,对修改关闭"。换言之,开闭原则要求我们在设计软件时,应该尽量避免直接修改已有的代码,而是通过添加新的代码来扩展功能,从而使系统更加稳定和灵活。

这个原则的核心思想就是面向对象设计的继承和多态特性,即通过继承来扩展原有的功能,而不是直接修改原有的代码。同时,通过多态可以将具体的实现与抽象的接口分离开来,从而降低了代码的耦合度,提高了代码的可维护性和可扩展性。

总之,遵循开闭原则可以使软件系统具有更好的可维护性、可扩展性和可复用性,从而降低软件开发的成本和风险。

里氏替换原则

里氏替换原则是面向对象设计中的重要原则之一,它指出:任何一个基类可以出现的地方,子类一定可以出现。也就是说,子类可以完全替代父类并且不会影响程序的正确性。

这个原则的意义在于保证代码的可维护性、可扩展性和可复用性。如果不遵循里氏替换原则,可能会导致程序的耦合度过高,增加了后期维护的难度,并且给系统带来了潜在风险。

具体而言,里氏替换原则需要满足以下条件:

  1. 子类必须完全实现父类的抽象方法。

  2. 子类可以有自己的方法,但不能覆盖父类的非抽象方法。

  3. 子类的前置条件必须弱于父类;子类的后置条件必须强于父类。

  4. 子类不能抛出比父类更多或更宽泛的异常。

总之,里氏替换原则是一种优秀的编程习惯,它可以帮助我们编写出高质量、可维护的代码,提高程序的灵活性和可复用性。

接口隔离原则

接口隔离原则(Interface Segregation Principle,ISP)是面向对象设计中的一项原则,指的是客户端不应该依赖于它不需要的接口。简而言之,一个接口应该只包含客户端需要的方法,而不应该强迫客户端实现它们不需要的方法。

这个原则的目标是减少系统的耦合性,提高系统的可维护性、可扩展性和可重用性。如果一个接口包含了过多的方法,那么实现这个接口的类就会出现“胖接口”的问题,这样会导致代码的臃肿和复杂度的增加,影响程序的可读性、可维护性和可测试性。

因此,按照接口隔离原则,我们应该将一个大接口拆分成多个小接口,每个小接口提供一组相关的方法,客户端只需要实现自己需要的接口即可。这样可以降低实现的难度,减少出错的可能性,同时也方便后期对系统的维护和修改。

依赖倒置原则

依赖倒置原则(Dependence Inversion Principle,DIP)是指设计代码结构时,高层模块不应该依赖低层模块,二者都应该依赖其抽象。抽象不应该依赖细节,细节应该依赖抽象。这个原则是面向对象设计中很重要的一条原则之一,它有助于降低代码的耦合性和提高代码的灵活性、可读性和可扩展性。

标签:应该,Java,原则,子类,代码,接口,笔记,父类
From: https://www.cnblogs.com/Bota5ky/p/17298522.html

相关文章

  • 依赖倒置原则
    依赖倒置原则/***依赖倒置原则(DIP)*TV(打开之前,)就可以控制灯的开关状态*高方法,实现前,必须实现低方法,执行入库前,记录日历*/publicclassdipTest{//定义一个接口:开关publicinterfaceSwitchable{voidturnOn();voidturnOff();}publicst......
  • 【ZYNQ】笔记:VDMA彩条显示实验
    【学习视频】正点原子https://www.bilibili.com/video/BV11j411f7Co===================================================================【学习笔记】【1】DDR的帧缓存操作:VDMA写数据至DDR;VDMA再从DDR中读取数据。作用:解决视频源与显示设备间速率、分辨率不匹配的问题。......
  • java中的引用
    引用分类强引用强引用是我们常见的普通对象引用,只有还有强引用指向一个对象,就表明这个对象还“存活”,垃圾收集器不会碰这个对象当一个对象被强引用对象引用时,它就处于可达状态,它是不能被垃圾回收的,即使出现了OOM也不会对该对象回收软引用软引用是相对于强引用......
  • JAVA实现单链表修改和删除数据节点
    JAVA实现单链表修改和删除数据节点一、修改单链表中的一个节点①实现思路因为带头节点的链表中头节点的next域不能发生改变(始终指向单链表的头节点),否则将找不到该链表。所以我们需要先找一个辅助节点temp来进行节点代理操作。通过遍历链表,使辅助节点temp后移,找到要修改的节点......
  • Java-SPI机制详解
    Java之SPI机制详解1:SPI机制简介SPI全称是ServiceProviderInterface,是一种JDK内置的动态加载实现扩展点的机制,通过SPI技术我们可以动态获取接口的实现类,不用自己来创建。这个不是什么特别的技术,只是一种设计理念。2:SPI原理JavaSPI实际上是基于接口的编程+策略模......
  • UE5 开发笔记
    需要在游戏过程中一直存在的代码写在哪?写在继承自UGameInstanceSubsystem类的自定义编程子系统类中。参考:《InsideUE4》GamePlay架构(十一)Subsystems-知乎(zhihu.com)......
  • JavaScript 有效的字符串方法
    目录获得字符串的长度用处在字符串中查找子字符串找到字符串的位置判断是否包含特定子字符串截取子字符串的方法转换大小写替换字符串的某部分本文内容部分截取自该网站,不同部分则为本人笔记。获得字符串的长度letbrowserType='mozilla';browserType.length;用处检......
  • 剑指offer66(Java)-构建乘积数组(中等)
    题目:给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中 B[i]的值是数组A中除了下标i以外的元素的积,即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。 示例:输入:[1,2,3,4,5]输出:[120,60,40,30,24] 提示:所有元素乘积之和不会......
  • 【Java 并发】【九】【AQS】【八】ReentrantReadWriteLock之ReadLock读锁原理
    1 前言上节我们看了下ReentrantReadWriteLock读写锁的写锁的申请和释放过程,这节我们就来看下读锁的。2 线程读锁记录回顾一下之前的例子,在读写并发操作的时候,读取数据的时候加读锁:publicclassReentrantReadWriteLockTest{//声明一个读写锁privatestaticR......
  • 【JAVA树根白话二】——继承
    JAVA树根白话二继承Begin……[ABC]继承——面向对象的三个基本特征之一(另外两个是封装、多态) 应用场景:当封装两个类后,第一个类中有一个非常复杂的成员函数,第二个类也需要同样的一个成员函数。如果第二个类重新编写成员函数,会增加开发时间,并且可能会因为一些疏忽,造......