Java设计模式中的七大原则详细讲解

yizhihongxing

Java设计模式中的七大原则详细讲解

1. 单一职责原则

单一职责原则(Single Responsibility Principle,SRP)指的是一个类或者模块只负责完成一个职责或功能。如果一个类职责过多可能导致其难以维护,因此需要将其拆分成多个类。

例如,我们有一个 User 类,其职责包括用户登录和注册,查看用户信息等。如果我们将用户登录和注册另外封装成一个 Auth 类,那么 User 类就只需要负责处理查看用户信息这个职责,代码会更加清晰易懂。

2. 开闭原则

开闭原则(Open-Closed Principle,OCP)指的是一个软件实体应该对扩展开放,对修改关闭。也就是说,在不修改原有代码的前提下,能够扩展新的功能。这样可以提高程序的复用性和可维护性。

例如,我们有一个 Animal 类,其具有类似于 run()sleep() 等方法。现在我们需要扩展一些新的行为,比如 fly(),我们可以采用继承的方式,在原有代码基础上新增一个 Bird 类,并实现 fly() 方法,这样就实现了对扩展开发,对修改关闭。

3. 里氏替换原则

里氏替换原则(Liskov Substitution Principle,LSP)是基于面向对象设计基本特征之一——继承而引入的。它指出,如果一个程序使用的是父类对象的话,那么一定可以使用其子类来进行替换,而不会影响程序的正确性。

例如,我们有一个抽象的 Shape 类,其有一个计算面积的方法。现在我们在这个基础上分别拓展出了 TriangleRectangle 类,并分别实现了计算自己面积的方法。此时,我们可以将 TriangleRectangle 对象作为 Shape 对象使用,以便进行统一的处理。

4. 接口隔离原则

接口隔离原则(Interface Segregation Principle,ISP)指的是多个客户端不应该依赖着他们不需要的接口。这主要是为了避免类的接口过于臃肿而不好维护,同时也可以避免各种与实际需求不符的问题。

例如,我们有一个 Calculator 接口,其中定义了基本的 add()subtract() 等方法。如果客户端仅仅需要使用 add() 方法,那么我们可以将其定义为单独的 Adder 接口,避免客户端依赖接口过于臃肿。

5. 依赖倒置原则

依赖倒置原则(Dependency Inversion Principle,DIP)是指高层模块不应该依赖底层模块,而是应该依赖其抽象。同时,抽象不应该依赖细节,细节应该依赖抽象。

例如,我们有一个 Database 类,其提供数据库的增删改查一系列方法。如果我们在主程序中直接调用这些方法,那么主程序将会与 Database 类产生强耦合,而且会导致代码难以维护和修改。相反,我们可以定义一个 IDatabase 接口,主程序通过该接口与 Database 类产生关联,这样就能使得主程序的修改对 Database 类的修改产生最小影响。

6. 迪米特法则

迪米特法则(Law of Demeter,LOD)又称最小知识原则(Least Knowledge Principle,LKP),是指一个对象应该对其他对象有尽可能少的了解。也就是说,与其他对象的交互应该尽可能地限制在最小化的范围内。这样可以降低对象之间的耦合度,从而提高软件系统的稳定性和可维护性。

例如,我们有一个 Car 类,其内部需要包含 EngineWheelLight 等多个零件。如果我们在 Car 类中直接调用这些零件的方法,那么将会导致代码的瘤背软,难以扩展和维护。相反,我们可以在 Car 类中仅包含这些零件的引用,在需要调用相关零件的方法时,以参数的方式引入,就能践行最小化知识原则,降低对象间的耦合。

7. 合成复用原则

合成复用原则(Composite Reuse Principle,CRP)是指在设计时应当优先使用对象组合,而不是继承。通过使用对象组合,可以灵活的对象的功能,并且可以避免继承所带来的紧耦合关系。

例如,我们有一个 Person 类,其中包含 HeadArmLeg 等多个部件。如果我们采用继承的方式来拓展 ManWoman 类,那么就会导致代码的耦合度太高。相反,我们可以采用对象组合的方式,将 HeadArmLeg 等部件定义为对象,并在 Person 中引用这些对象,这样就可以灵活地拓展 ManWoman 类了。

以上七大原则,是实际编程中必须遵守的基本规则,能够提高代码的质量和可维护性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java设计模式中的七大原则详细讲解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • js操作剪切板

    js操作剪切板 在现代Web开发中,常常需要通过复制、粘贴剪切板内容来提升用户体验。JavaScript提供了一种简单的方法来访问浏览器剪贴板并执行相关操作。 判断浏览器是否支持操作剪贴板 在进行如下操作之前,我们需要明确当前浏览器是否支持剪贴板操作。这里我们可以通过 document.queryCommandSupported()方法来判断某个指定命令是否…

    其他 2023年3月28日
    00
  • Jboss Marshalling服务端无法接受消息

    问题描述: 在使用 JBoss Marshalling 进行序列化和反序列化过程中,某些情况下可能会面临“服务器中断”或“服务端无法接收消息”等问题,这些问题可能会让我们的程序无法正常工作,需要找到并解决这些问题。 解决方法: 以下是解决问题的详细步骤: 步骤 1:了解问题 首先,我们需要了解问题的具体原因。在使用 JBoss Marshalling 过程中…

    other 2023年6月27日
    00
  • 在Android中高效的加载大图的方法示例

    下面是在Android中高效的加载大图的方法示例的攻略: 1. 了解为什么要高效的加载大图 在Android开发中,图片是我们经常会用到的资源之一,而对于单张大图的加载,过度的处理可能会导致内存溢出,从而影响程序的稳定性和用户的使用体验。因此,我们需要对大图进行高效、合理的处理,保证程序的稳定和流畅。 2. 使用BitmapFactory.Options来加…

    other 2023年6月25日
    00
  • foreach中的index

    以下是详细讲解“foreach中的index的完整攻略,过程中至少包含两条示例说明”的标准Markdown格式文本: foreach中的index 在使用foreach循环时,有时需要获取当前循环的索引值。本攻略将介绍如何在foreach循环中获取索引值。 方法一:使用$index变量 可以使用$index变量来获取当前循环的索引值。可以使用以下示例代码在f…

    other 2023年5月10日
    00
  • 使用PowerShell操作Windows服务的命令小结

    下面是使用PowerShell操作Windows服务的命令小结的完整攻略。 命令小结 获取服务列表 使用 Get-Service 命令可以列出当前系统中所有的服务及其状态。 例如,想要查询所有服务的状态信息,可以执行以下命令: Get-Service 启动服务 使用 Start-Service 命令来启动指定的服务。 例如,将服务名为 Spooler 的服务…

    other 2023年6月26日
    00
  • Java动态脚本Groovy获取Bean技巧

    Java动态脚本Groovy获取Bean技巧 在Java中使用Groovy可以轻松地使用动态脚本获取Bean。这里介绍一些Java动态脚本Groovy获取Bean的技巧。 导入Groovy库 Groovy是一种基于JVM的动态脚本语言,所以它可以和Java代码一起运行。为了使用Groovy获取Bean,需要在Java项目中导入Groovy库。 示例代码 @G…

    other 2023年6月27日
    00
  • 查看Linux系统是32位还是64位的方法总结

    查看Linux系统是32位还是64位的方法总结 要确定Linux系统是32位还是64位,可以使用以下方法: 方法一:使用命令行查看 打开终端或命令行界面。 输入以下命令并按下回车键: uname -m 系统将返回一个字符串,表示系统的架构。如果返回的是x86_64,则表示系统是64位的;如果返回的是i686或i386,则表示系统是32位的。 示例说明: 输入…

    other 2023年7月28日
    00
  • 基于SpringBoot加载Mybatis的TypeAlias问题

    基于SpringBoot加载Mybatis的TypeAlias问题攻略 1. 什么是TypeAlias 在Mybatis中,TypeAlias是用于将Java类的全限定名映射为一个简短的别名。通过使用TypeAlias,我们可以在Mybatis的配置文件中使用简短的别名来指代某个Java类,提高代码的可读性和简洁性。 2. SpringBoot中加载Myba…

    other 2023年6月28日
    00
合作推广
合作推广
分享本页
返回顶部