Design Principles in Java2025 年 5 月 5 日 | 阅读 6 分钟 在 Java 中,设计原则是设计决策中用作规则的一组建议。在 Java 中,设计原则类似于设计模式的概念。设计原则和设计模式之间的唯一区别在于,设计原则更加通用和抽象。设计模式包含更实用的建议和具体的指导。设计模式与整个类问题相关,而不仅仅是泛化的编码实践。 ![]() 以下是一些最重要的设计原则: SOLID 原则
其他原则
让我们一一理解所有原则 DRY 原则DRY 原则代表 Don't Repeat Yourself(不要重复自己)原则。它是所有编程语言的常见原则之一。DRY 原则表示: 在一个系统中,每段逻辑都应该有单一的、无歧义的表示。 让我们以 DRY 原则为例 狗和猫说话方式不同,但它们都需要吃食物。它们共同的功能是“吃食物”,所以我们可以将这个共同的功能放到父类“动物”中,然后我们在子类“狗”和“猫”中扩展这个父类。 现在,每个类都可以专注于自己独特的逻辑,因此无需在两个类中都实现相同的功能。 编译并运行上面的代码后,我们将看到以下输出: 输出 Eat food Cat Meow! Eat food Dog Woof! 违反 DRY 原则 违反 DRY 原则的情况被称为 WET 解决方案。WET 是以下缩写的组合:
这些重复并非总是坏事,因为有时为了使代码的依赖性降低、更具可读性、内在类不相似等,重复是值得提倡的。 SRPSRP 是另一个设计原则,代表 单一职责原则。SRP 原则指出,一个类不应该有两个功能。它也可以转述为: 类应该只有一个且仅有一个改变的理由。当存在多个职责时,存在多个改变该类的理由。因此,同一个类中不应存在多个可能受影响的独立功能。 SRP 原则有助于我们:
LSPLSP 是另一个设计原则,代表 Liskov 替换原则。LSP 指出,派生类应该能够在不改变我们代码的情况下替换基类。 LSP 与 SRP 和 ISP 密切相关,因此,违反 SRP 或 ISP 可能就是违反(或成为)LSP。LSP 违反的原因是,如果一个类执行多个功能,那么扩展该类的子类不太可能在功能上实现这两个或多个功能。 DIP另一个最重要的设计原则是 DIP,即 依赖倒置原则。该原则指出,低级和高级模块应该解耦,这样低级模块的更改就不需要重新编写高级模块。 高级和低级模块不应该相互依赖。它们应该依赖于抽象,例如接口。依赖倒置原则还指出,细节应该依赖于抽象,而不是抽象应该依赖于细节。 KISS 原则这是另一个设计原则,代表 Keep It Simple and Stupid(保持简单愚蠢)原则。该原则只是一个提醒,让我们保持代码对人类来说可读且简单。如果一个方法处理多个用例,我们需要将其拆分成更小的函数。 KISS 原则指出,在大多数情况下,堆栈调用不应严重影响程序的性能,除非效率不是极其重要。 另一方面,冗长且难以阅读的方法对于人类程序员来说将非常难以维护和查找 bug。违反 DRY 原则可能是我们自己造成的,因为如果我们有一个执行多个任务的方法,我们就无法调用该方法来执行其中一项任务。因此,我们将为该任务创建另一个方法。 ISPISP 是另一个设计原则,代表 接口隔离原则。该原则指出,客户端不应该被限制依赖于他们并未全部使用的接口。这意味着接口应包含确保功能所需的最小方法集,并且仅限于一个功能。 例如,如果我们创建一个 Burger 接口,我们不需要实现 addCheese() 方法,因为并非所有类型的 Burger 都提供奶酪。 让我们假设所有汉堡都需要烘烤并添加酱汁,并按以下方式定义该汉堡接口: 现在,让我们在 VegetarianBurger 和 CheeseBurger 类中实现 Burger 接口。 素食汉堡有卷心菜和番茄,而芝士汉堡有奶酪,但需要烘烤和酱汁,这些都在接口中定义。如果 addCheese() 和 addTomatoandCabbage() 方法位于 Burger 接口中,那么这两个类都必须实现它们,即使它们不需要两者。 开闭原则开闭原则是另一个重要的设计原则,属于 SOLID 原则。该原则指出,方法、对象或类应该对修改关闭,但对扩展开放。简单来说,该原则表明我们应该在考虑未来可能更新的情况下实现我们的模块和类。通过这样做,我们的模块和类将具有通用的设计,并且为了扩展它们的行为,我们不需要更改类本身。 我们可以创建新的字段或方法,但方式是我们不需要修改旧代码、删除已创建的字段以及重写已创建的方法。 开闭原则主要用于防止回归并确保向后兼容性。 组合优于继承原则组合优于继承原则是 Java 中另一个重要的设计原则。该原则帮助我们在 Java 中实现灵活且可维护的代码。该原则指出,我们应该实现接口而不是扩展类。我们何时实现继承:
同样,我们何时使用组合:
|
Java 长期以来一直是企业软件开发的核心,以其平台独立性、强大的生态系统和强大的社区支持而闻名。随着我们进入微服务和云计算时代,Java 仍在不断调整和变化,尤其是在引入容器化技术之后...
阅读 8 分钟
在本节中,我们将学习如何在 Java 中查找链表的中间节点。我们还将探讨查找中间节点的各种方法。给定:链表的第一个节点或 Head 被给出(在我们的示例中是 14...
阅读 6 分钟
组合设计模式是一种设计模式,它允许我们将对象排列成树形结构来表示部分-整体设计。它允许客户精确地处理单个项目和包。简单来说,它允许我们将单个对象与...
5 分钟阅读
回文串分区是将字符串分解成不同部分的过程。字符串,以便每个字符串都是一个回文串。回文串是指可以从前向后(例如“race car”)或从后向前读取的字符序列。这个问题已找到应用……
5 分钟阅读
在 Java 中,String 是最重要的主题。有很多与 String 相关概念,但字符串池概念是其中之一。Java 中的字符串池概念有点棘手。因此,在本节中,我们将讨论...
阅读 4 分钟
? 在 Java 中,菱形问题与多重继承有关。有时也称为致命菱形问题或致命的死亡菱形。这样的挑战之一是“菱形问题”,它出现在多重继承的上下文中。在本节中,我们将...
5 分钟阅读
许多与字符串相关的挑战中一个令人着迷的难题是查找和计数满足特定要求的子字符串。查找和计数至少包含一个元音和一个辅音的所有子字符串就是这样一个任务。这个问题说明了多种算法技术,从暴力方法...
阅读 8 分钟
java.lang.Package 类包含 getName() 函数。可以使用 Package 类获取包名。此方法返回的包名是 String 类型。语法:public String getName() 参数:此方法不接受任何参数。返回值:包名是...
阅读 2 分钟
在本节中,我们将了解什么是中间数字,并创建 Java 程序来查找中间数字。它经常出现在 Java 编码测试和学术界。中间数字是数字的中间数字,它正好位于数字的中间...
阅读 2 分钟
FloatBuffer put() 主要有两种方法,它们接受不同的参数。put(float f) put(int index, float f) i. put(float f) java.nio.FloatBuffer 类具有 put(float f) 函数。新生成的浮点缓冲区以指定浮点数写入当前位置,然后位置会递增...
5 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India