0

0

如何在Java中理解开闭原则

P粉602998670

P粉602998670

发布时间:2025-10-24 08:33:02

|

756人浏览过

|

来源于php中文网

原创

开闭原则要求软件实体对扩展开放、对修改关闭,即通过添加新代码而非修改旧代码来应对需求变化。例如,计算图形面积时,应定义Shape接口,让各类如Circle、Rectangle实现自身面积方法,AreaCalculator通过Shape接口计算总面积,新增图形只需新增类实现Shape,无需修改原有类,从而降低耦合、提升可维护性。结合工厂或策略模式可进一步增强扩展性,核心是抽象变化、依赖接口、利用多态。

如何在java中理解开闭原则

开闭原则(Open-Closed Principle, OCP)是面向对象设计中的一个核心原则,它指出:一个软件实体(如类、模块、函数)应该对扩展开放,对修改关闭。这意味着在不改动已有代码的前提下,应该能够为系统添加新功能。这样可以减少引入bug的风险,提高代码的可维护性和可复用性。

理解“对扩展开放,对修改关闭”

这句话的核心在于:当需求变化时,我们不是通过修改已有的类来实现新功能,而是通过添加新的类或方法来完成扩展。原有代码保持不变,依然稳定运行。

例如,假设你有一个计算图形面积的程序:

public class AreaCalculator {
public double calculateArea(Object shape) {
if (shape instanceof Circle) {
Circle c = (Circle) shape;
return Math.PI * c.radius * c.radius;
} else if (shape instanceof Rectangle) {
Rectangle r = (Rectangle) shape;
return r.width * r.height;
}
throw new IllegalArgumentException("Unknown shape");
}
}

如果要增加三角形,就必须修改这个类,违反了开闭原则。

立即学习Java免费学习笔记(深入)”;

使用多态实现开闭原则

更好的方式是定义一个公共接口或抽象类,让每个图形自己实现面积计算:

CPWEB企业网站管理系统2.2 Beta
CPWEB企业网站管理系统2.2 Beta

CPWEB企业网站管理系统(以下称CPWEB)是一个基于PHP+Mysql架构的企业网站管理系统。CPWEB 采用模块化方式开发,功能强大灵活易于扩展,并且完全开放源代码,面向大中型站点提供重量级企业网站建设解决方案。CPWEB企业网站管理系统 2.2 Beta 测试版本,仅供测试,不建议使用在正式项目中,否则发生任何的后果自负。

下载
public interface Shape {
double area();
}

public class Circle implements Shape {
private double radius;
public double area() { return Math.PI * radius * radius; }
}

public class Rectangle implements Shape {
private double width, height;
public double area() { return width * height; }
}

现在计算总面积的逻辑可以依赖于接口:

public class AreaCalculator {
public double calculateTotalArea(List shapes) {
return shapes.stream().mapToDouble(Shape::area).sum();
}
}

当你需要新增三角形时,只需创建一个新的类实现Shape接口,无需修改AreaCalculator或其他已有类。

利用策略模式或工厂模式增强扩展性

在更复杂的场景中,可以结合设计模式进一步强化开闭原则。比如使用工厂模式创建对象,或策略模式切换算法,都能避免在核心逻辑中写死判断分支。

关键点包括:

  • 把变化的部分抽象成接口或抽象类
  • 通过继承和多态支持行为扩展
  • 高层模块依赖抽象,而不是具体实现
  • 利用依赖注入或工厂来解耦对象创建

基本上就这些。开闭原则不是完全禁止修改,而是强调尽量通过扩展而非修改来应对变化。在Java中,合理使用接口、抽象类和设计模式,能让代码更容易遵循这一原则。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

775

2023.08.22

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

56

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

52

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.11.27

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

73

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

101

2025.10.23

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1079

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

169

2025.10.17

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.9万人学习

C# 教程
C# 教程

共94课时 | 7.7万人学习

Java 教程
Java 教程

共578课时 | 52.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号