当前位置: 首页 > news >正文

设计模式之开闭原则:如何优雅地扩展软件系统

在现代软件开发中,设计模式是解决常见问题的最佳实践。其中,开闭原则作为面向对象设计的六大基本原则之一,为软件系统的可维护性和扩展性提供了强大的支持。本文将深入探讨开闭原则的核心理念,以及如何在实际项目中运用这一原则,以便更好地设计软件系统。

一、开闭原则的核心思想

开闭原则,也被称为“对扩展开放,对修改封闭”,意味着软件实体(如类、模块、函数等)应该通过扩展来增加功能,而不是通过修改已有的代码。这意味着在设计软件时,我们应该尽量使代码具有可复用性和可扩展性,以便于在未来添加新功能时不需要修改已有的代码。

二、开闭原则在实践中的应用

假设我们正在设计一个电商系统,其中包含不同类型的商品,有普通商品和折扣商品,每种商品有不同的价格计算方式。

Product接口

一开始我们有一个Product接口

public interface Product {double getPrice();
}
 普通商品类
public class NormalProduct implements Product {private double price;public NormalProduct(double price) {this.price = price;}@Overridepublic double getPrice() {return this.price;}
}

随着业务发展,我们需要添加折扣商品,如果直接修改Product类或者NormalProduct类来支持折扣逻辑,就违反了开闭原则。正确的做法是扩展一个新的类。

折扣商品类
public class DiscountedProduct implements Product {private double originalPrice;private double discountRate;public DiscountedProduct(double originalPrice, double discountRate) {this.originalPrice = originalPrice;this.discountRate = discountRate;}@Overridepublic double getPrice() {return this.originalPrice * (1 - discountRate);}
}

这样,在添加新的折扣商品类型时,我们并没有修改原有的Product接口或NormalProduct类,而是增加了新的实现类DiscountedProduct来满足新的需求,这就是开闭原则的体现。

在客户端代码中,可以通过产品接口处理不同类型的商品。

购物车类
public class ShoppingCart {private List<Product> products;public void addProduct(Product product) {products.add(product);}public double getTotalPrice() {return products.stream().mapToDouble(Product::getPrice).sum();}
}

上述代码中的ShoppingCart类不关心具体的产品类型,只要求产品实现Product接口,因此当添加新的产品类型时,购物车的逻辑不需要做任何修改,保持了对修改的封闭性,同时对新的产品类型(扩展)则是开放的。

三、总结

开闭原则是软件设计的核心思想之一,它鼓励我们通过扩展来增加新功能,而不是通过修改已有代码。在实际项目中运用开闭原则,需要我们注重抽象层设计、策略模式和装饰器模式等设计模式的运用。通过遵循开闭原则,我们可以设计出更加灵活、可扩展的软件系统,从而降低维护成本、提高软件质量。

http://www.lryc.cn/news/281711.html

相关文章:

  • Python Pandera 用于数据验证和清洗:是一个强大的工具用起来
  • 英诺赛科推出BMS方案,搭载100V双向导通VGaN
  • 如何用Mac工具制作“苹果高管形象照”
  • 回环检测算法:Stable Trangle Descriptor
  • MetaGPT入门(二)
  • AI嵌入式K210项目(4)-FPIOA
  • FPGA开发设计
  • 上海亚商投顾:沪指冲高回落 旅游板块全天强势
  • Linux网络--- SSH服务
  • 2.1 数组
  • 超维空间M1无人机使用说明书——53、ROS无人机二维码识别与降落——V2升级版本
  • 瑞萨IDE:CS+ for CC进行BootLoader升级时开发环境配置
  • 翻译: Streamlit从入门到精通 显示图表Graphs 地图Map 主题Themes 二
  • Java 开源扫雷游戏 JMine 发布新版 3.0 及介绍视频
  • Vue v-model 详解
  • 一个超级牛逼的消息推送系统Gotify 使用Gotify来搭建你的消息推送系统
  • 【架构设计】单体软件向微服务化演变
  • 部署ATS(Apache Traffic Server)和Nginx正向代理服务性能对比
  • kafka入门(六):日志分段(LogSegment)
  • Python 与 PySpark数据分析实战指南:解锁数据洞见
  • docker使用nginx部署vue刷新页面404
  • openGauss学习笔记-198 openGauss 数据库运维-常见故障定位案例-分析查询效率异常降低的问题
  • 使用Map.clear()、List.clear()方法,清空时注意!
  • 如何配置Pycharm服务器并结合内网穿透工具实现远程开发
  • c++中的以及链表的基础使用
  • vue v-for循环拖拽排序,实现数组选中的数据拖拽后对应的子数据也进行重新排序
  • google cloud storage批量文件下载
  • easyexcel 3.0.x 版本实现指定列 锁定以及指定列隐藏
  • whistle代理+mock轻松解决“页面端“测试接口没数据难题
  • HNU-计算机网络-实验5(自选)-安全相关编程实验