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

可扩展性设计架构模式——开闭原则

1. 概述

        在架构设计中,遵循开闭原则(Open/Closed Principle, OCP),代码应该“对扩展开放,对修改关闭”是实现可扩展性的关键。这个原则指导我们设计系统时,应使其对新增功能开放,而对现有代码的修改封闭。这样,当系统需求变化或需要添加新功能时,我们可以通过添加新的代码模块而不是修改现有代码来实现,从而减少了对现有系统稳定性和已有功能的风险。

底层原理解释

        开闭原则基于抽象构建架构。系统中稳定的部分(例如数据模型、核心逻辑)应该通过抽象接口或者抽象类来定义,而变化的部分(例如具体实现、附加功能)则通过具体的实现类来扩展。这种方式使得核心架构保持稳定,同时提供了扩展的灵活性。

使用抽象和封装实现OCP

        通过定义接口或抽象类,我们设定了一个明确的契约或者说规范,具体的实现可以有不同的版本,但对外暴露的接口是不变的。这样,当系统增加新功能或者变化时,只需添加新的实现类即可,无需修改现有的业务逻辑。

源代码层面的实现

        以一个简单的用户管理系统为例,我们展示如何应用OCP原则。系统起初只支持通过用户名查找用户,后续需要支持通过邮箱查找。

第一步:定义用户服务接口
public interface UserService {User findUser(String identifier);
}
第二步:实现初始版本
public class UserNameService implements UserService {private Map<String, User> users = new HashMap<>();@Overridepublic User findUser(String username) {return users.get(username);}
}
第三步:添加新功能(按邮箱查找用户)

为了支持通过邮箱查找用户,我们添加一个新的实现类,而不修改原有的UserNameService类。

public class UserEmailService implements UserService {private Map<String, User> users = new HashMap<>();@Overridepublic User findUser(String email) {return users.values().stream().filter(user -> user.getEmail().equals(email)).findFirst().orElse(null);}
}
第四步:配置使用

        系统配置时,可以根据需要创建不同的UserService实例,或者通过一个工厂方法来决定实例化哪个服务。

public class UserServiceFactory {public UserService getUserService(String type) {if ("email".equals(type)) {return new UserEmailService();} else {return new UserNameService();}}
}

        通过这种方式,我们实现了在不修改现有代码(遵循对修改关闭的原则)的基础上,通过增加新的模块(遵循对扩展开放的原则)来支持新的功能。当添加新的查找方法时,现有的代码不需要任何更改,新的功能可以通过添加新的实现类轻松集成进系统。

结论

        在实际的系统设计和实现过程中,开闭原则提供了一种强有力的方法论来帮助我们设计出易于扩展且稳定的系统。它促使我们通过抽象和多态性来面对变化,是实现可持续发展和易于维护的系统的关键策略之一。

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

相关文章:

  • 算法随笔_17: 回文数
  • 计算机的错误计算(二百一十九)
  • React进阶之高阶组件HOC、react hooks、自定义hooks
  • 【Pytest】基础到高级功能的理解使用
  • RHCE实验详解
  • 备赛蓝桥杯之第十五届职业院校组省赛第二题:分享点滴
  • MyBatis 注解开发详解
  • Kivy App开发之UX控件VideoPlayer视频播放
  • 简单排序算法
  • C语言初阶牛客网刷题——JZ17 打印从1到最大的n位数【难度:入门】
  • 基于springboot+vue的校园二手物品交易系统的设计与实现
  • 开发环境搭建-2:配置 python 运行环境(使用 uv 管理 python 项目)
  • STM32 ST7735 128*160
  • 【面试总结】FFN(前馈神经网络)在Transformer模型中先升维再降维的原因
  • VB读写ini配置文件将运行文件放入任务计划程序设置为开机自启动
  • Java基础 (一)
  • 数据结构——实验六·散列表
  • springboot网上书城
  • 如何在 Pytest 中使用命令行界面和标记运行测试
  • 不建模,无代码,如何构建一个3D虚拟展厅?
  • github汉化
  • Unity Line Renderer Component入门
  • 数据库的三级模式结构与两级映像
  • TCP断开通信前的四次挥手(为啥不是三次?)
  • win32汇编环境,按字节、双字等复制字符的操作
  • .net 项目引用与 .NET Framework 项目引用之间的区别和相同
  • RabbitMQ--延迟队列
  • 使用pyboard、micropython和tja1050进行can通信
  • JS学习之JavaScript模块化规范进化论
  • 亚博microros小车-原生ubuntu支持系列:7-脸部检测