【Java 设计模式】设计原则之开放封闭原则

文章目录

    • [1. 定义](#1. 定义)
    • [2. 好处](#2. 好处)
    • [3. 应用](#3. 应用)
    • [4. 示例](#4. 示例)
    • 结语

在软件开发中,设计原则是创建灵活、可维护和可扩展软件的基础。
这些原则为我们提供了指导方针,帮助我们构建高质量、易理解的代码。

✨单一职责原则(SRP)
✨开放/封闭原则(OCP)
✨里氏替换原则(LSP)
✨依赖倒置原则(DIP)
✨接口隔离原则(ISP)
✨合成/聚合复用原则(CARP)
✨迪米特法则(LoD)

在面向对象设计中,开放/封闭原则是一个基础且重要的设计原则。它强调软件实体(类、模块、函数等)应该是可以扩展的,但是不可修改的。在本文中,我们将深入研究开放/封闭原则,了解它的定义、背后的理念以及如何在实际开发中应用。

1. 定义

开放/封闭原则是由伯特兰·梅耶尔(Bertrand Meyer)首次提出的,它规定软件实体应该是可以扩展的,但是不可修改的。换句话说,一个模块的行为应该可以通过扩展来进行改变,而不是通过修改已有的代码。这有助于保持系统的稳定性,减少对已有代码的影响。

2. 好处

开放/封闭原则有助于提高代码的可维护性、可读性和可扩展性。以下是一些应用开放/封闭原则的好处:

  • 降低风险:

    当系统需要变化时,通过扩展而不是修改已有的代码,降低了引入错误的风险,减少了对系统稳定性的影响。

  • 可维护性:

    通过保持现有代码的稳定性,使得系统更容易维护。开发人员可以更专注于新功能的开发,而不必担心影响到其他部分。

  • 可复用性:

    通过遵循开放/封闭原则,代码更容易被其他模块或项目重用,因为现有的功能不会随着变化而失效。

  • 可测试性:

    模块的行为通过扩展而不是修改,使得单元测试更容易编写,测试代码覆盖更全面。

3. 应用

在应用开放/封闭原则时,我们可以考虑以下几个方面:

  • 使用抽象类和接口:

    使用抽象类和接口定义一组规范,然后通过实现这些规范来进行扩展。这有助于确保扩展时不会修改现有的代码。

  • 使用设计模式:

    一些设计模式,如策略模式、观察者模式等,都是遵循开放/封闭原则的典型实现。它们提供了一种灵活的方式来添加新的功能,而不需要修改现有的代码。

  • 遵循依赖倒置原则:

    依赖倒置原则是开放/封闭原则的基石之一。通过依赖注入等方式,确保高层模块不依赖于低层模块的具体实现,而是依赖于抽象。

4. 示例

假设我们有一个图形绘制框架,其中有一个 Shape 类用于表示不同形状的图形。现在我们希望在框架中添加一个新的形状,例如矩形。如果我们遵循开放/封闭原则,我们不应该直接修改 Shape 类,而是应该通过扩展的方式添加新的形状。

Shape.java

java 复制代码
package com.cheney.demo;

public abstract class Shape {
    public abstract void draw();
}

Circle.java

java 复制代码
package com.cheney.demo;

public class Circle extends Shape {
    @Override
    public void draw() {
        System.out.println("画一个圆");
    }
}

Rectangle.java

java 复制代码
package com.cheney.demo;

public class Rectangle extends Shape {
    @Override
    public void draw() {
        System.out.println("画一个长方形");
    }
}

通过创建新的 Rectangle 类,我们扩展了图形绘制框架而不修改现有的代码。这符合开放/封闭原则的要求。

结语

开放/封闭原则是面向对象设计中一个基础而重要的原则,它有助于创建稳定、可维护、可扩展的代码。通过遵循这一原则,我们可以更容易地适应变化,减少系统的复杂性,并提高代码的质量。在实际项目中,开发人员应该时刻关注如何设计代码以符合开放/封闭原则,从而创建更加灵活和可维护的软件。

相关推荐
The Future is mine12 分钟前
Python计算经纬度两点之间距离
开发语言·python
Enti7c13 分钟前
HTML5和CSS3的一些特性
开发语言·css3
腥臭腐朽的日子熠熠生辉19 分钟前
解决maven失效问题(现象:maven中只有jdk的工具包,没有springboot的包)
java·spring boot·maven
爱吃巧克力的程序媛20 分钟前
在 Qt 创建项目时,Qt Quick Application (Compat) 和 Qt Quick Application
开发语言·qt
ejinxian21 分钟前
Spring AI Alibaba 快速开发生成式 Java AI 应用
java·人工智能·spring
杉之26 分钟前
SpringBlade 数据库字段的自动填充
java·笔记·学习·spring·tomcat
圈圈编码1 小时前
Spring Task 定时任务
java·前端·spring
俏布斯1 小时前
算法日常记录
java·算法·leetcode
独好紫罗兰1 小时前
洛谷题单3-P5719 【深基4.例3】分类平均-python-流程图重构
开发语言·python·算法
27669582921 小时前
美团民宿 mtgsig 小程序 mtgsig1.2 分析
java·python·小程序·美团·mtgsig·mtgsig1.2·美团民宿