设计模式之开闭原则(内附代码展示)

news/2024/11/21 1:35:01/

开闭原则是面向对象设计中最基本的原则之一,它的核心思想是一个软件实体应该对扩展开放,对修改关闭。换句话说,当需要扩展一个模块的功能时,应该通过增加代码来实现,而不是修改原有的代码。

开闭原则的实现需要遵循以下两个原则:

1. 抽象出可变和不可变的部分。将不变的部分抽象出来,实现可重用性和稳定性;将变化的部分抽象出来,以接口的形式提供给外部。

2. 继承和多态。当需要对模块进行扩展时,应该通过继承和多态的方式来实现,而不是直接修改原有的代码。

开闭原则的优点主要包括:

1. 提高系统的可维护性。由于不需要修改原有代码,所以修改的风险和代价都比较小。这使得系统更容易被维护。

2. 提高系统的可扩展性。把变化的部分抽象出来,以接口的形式提供给外部,增加了系统的灵活性和可扩展性。这使得系统能够更加适应需求变化。

3. 提高代码的复用性。将不变的部分抽象出来,让它们在不同的系统中都能够得到复用。这有助于提高代码的效率和可靠性。

4. 加强团队协作。开闭原则可以促进团队之间的协作,减少代码间的依赖和耦合。这有助于团队开发更加高效。

总之,开闭原则是面向对象设计中最基本的原则之一,它能够提高系统的可维护性、可扩展性和复用性。在设计软件时,务必要遵循开闭原则,以便将来更容易地修改和扩展代码。


在Python中,可以通过编写一个基类来展示开闭原则的应用。假设我们有一个图形类Shape,它有一个计算面积的方法area(),现在需要添加计算周长的方法perimeter(),但又不希望影响原有代码。

我们可以按照开闭原则的实现原则,将可变的方法perimeter()抽象成一个抽象方法,然后通过继承和多态来实现。

示例代码如下:

from abc import ABC, abstractmethodclass Shape(ABC):"""抽象基类"""@abstractmethoddef area(self):pass@abstractmethoddef perimeter(self):passclass Rectangle(Shape):"""矩形类"""def __init__(self, length, width):self.length = lengthself.width = widthdef area(self):return self.length * self.widthdef perimeter(self):return 2 * (self.length + self.width)class Circle(Shape):"""圆形类"""def __init__(self, radius):self.radius = radiusdef area(self):return 3.14 * self.radius ** 2def perimeter(self):return 2 * 3.14 * self.radiusif __name__ == '__main__':rect = Rectangle(4, 6)print("矩形面积:", rect.area())print("矩形周长:", rect.perimeter())circle = Circle(3)print("圆形面积:", circle.area())print("圆形周长:", circle.perimeter())

这里我们定义了一个抽象基类Shape,并且其中有两个抽象方法area()perimeter(),这些抽象方法是可变的。然后我们定义了两个具体的类Rectangle和Circle,它们分别继承自Shape类,并实现了area()perimeter()方法,这些方法是具体的。

通过这种方式,我们可以在不修改原有代码的情况下扩展其功能。例如,如果需要增加一个三角形类,只需要继承自Shape类并实现area()perimeter()方法即可。

总之,通过把可变的部分抽象出来,并采用继承和多态的方式来扩展代码的功能,可以遵循开闭原则的实现,使得代码更加健壮和灵活。


http://www.ppmy.cn/news/81962.html

相关文章

day18 - 使用直方图提高图像对比度

本期将使用图像直方图的相关知识来提高图像对比度,对图像进行优化,从而提高图像清晰度。 完成本期内容,你可以: 了解图像直方图的定义和计算方法了解直方图均衡化的原理学会使用直方图均衡化优化图像 若要运行案例代码&#xf…

快手新财报:曙光就在冲刺路上?

自短视频爆火以来,短视频行业的头部玩家——抖音和快手就迎来了飞速发展,甚至一度成为了国民“杀时间利器”。然而,随着互联网红利逐渐见顶,短视频行业竞争加剧,哪怕作为头部玩家,快手的日子也并不好过。 …

随想011:关于编程

1945 年时,刚开始有计算机,那时候使用二进制数编程到了40年代末期,出现了汇编器,可以自动将汇编程序转换为二进制数序列1951 年 Grace Hopper 发明了编译器1957 年,Fortran,第一个高级语言,首次…

Flutter 笔记 | Flutter 布局组件

布局类组件都会包含一个或多个子组件,布局类组件都是直接或间接继承SingleChildRenderObjectWidget 和MultiChildRenderObjectWidget的Widget,它们一般都会有一个child或children属性用于接收子 Widget。 不同的布局类组件对子组件排列(layo…

项目风险管理的四个阶段,你了解多少?

项目风险管理是项目管理的一部分,目的是保证项目总目标的实现。 风险管理包括风险识别、风险估计、风险解决和风险监控。风险管理贯穿在项目中的每个环节,在项目的生命周期中监控风险是非常重要的手段。 风险管理包含四个阶段: 1、风险识别…

开源云原生数仓引擎ByConity 存储计算分离架构和优势

供稿 | ByConity技术团队 出品 | CSDN 云计算 ByConity是一款字节跳动开源的云原生数仓引擎。它的一个重要优势是采用存储计算分离的架构,实现了读写分离和弹性扩缩容。这种架构确保读操作和写操作不会相互影响,使得计算资源和存储资源解耦,…

zabbix监控系统

一、Zabbix概述 1、使用zabbix的原因 作为一个运维,需要会使用监控系统查看服务器状态以及网站流量指标,利用监控系统的数据去了解上线发布的结果,和网站的健康状态。 利用一个优秀的监控软件,我们可以: ●通过一个友好的界面进…

【5.21】六、自动化测试—常用工具

目录 6.3 自动化测试常用工具 1. Selenium 2. Katalon Studio 3. UFT 6.3 自动化测试常用工具 常见的自动化测试工具: 1. Selenium Selenium是当前针对Web系统的最受欢迎的开源免费的自动化工具,它提供了一系列函数支持Web自动化测试,这些函数非常…