可扩展性设计架构模式——开闭原则
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();}}
}
通过这种方式,我们实现了在不修改现有代码(遵循对修改关闭的原则)的基础上,通过增加新的模块(遵循对扩展开放的原则)来支持新的功能。当添加新的查找方法时,现有的代码不需要任何更改,新的功能可以通过添加新的实现类轻松集成进系统。
结论
在实际的系统设计和实现过程中,开闭原则提供了一种强有力的方法论来帮助我们设计出易于扩展且稳定的系统。它促使我们通过抽象和多态性来面对变化,是实现可持续发展和易于维护的系统的关键策略之一。
相关文章:
可扩展性设计架构模式——开闭原则
1. 概述 在架构设计中,遵循开闭原则(Open/Closed Principle, OCP),代码应该“对扩展开放,对修改关闭”是实现可扩展性的关键。这个原则指导我们设计系统时,应使其对新增功能开放,而对现有代码的修改封闭。这…...
算法随笔_17: 回文数
上一篇: 算法随笔_16: 找出第k小的数对距离-CSDN博客 题目描述如下: 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左&…...
计算机的错误计算(二百一十九)
摘要 大模型能确定 sin(2.6^10) 的符号吗?实验表明,大模型的计算、推理均有问题。另外,结论也是错的。 前面讨论的内容为自变量是 2.6^100的正弦,本节讨论自变量为 2.6^10的正弦(对于某些大模型,2.6^100似…...
React进阶之高阶组件HOC、react hooks、自定义hooks
React高级 高阶组件 HOC属性代理反向继承属性代理和反向继承的区别实例实例一实例二 HooksHooks APIuseState:useEffect:useLayoutEffect:useRef:useContext:useReducer:useMemouseCallback 自定义Hooks 拓展ÿ…...
【Pytest】基础到高级功能的理解使用
文章目录 第一部分:Pytest 简介1.1 什么是 Pytest?1.2 Pytest 的历史1.3 Pytest 的核心概念1.4 Pytest 的特点1.5 为什么选择 Pytest? 第二部分:Pytest 的基本使用2.1 安装 Pytest2.2 编写第一个测试用例2.2.1 创建一个简单的测试…...
RHCE实验详解
目录 实验分析 环境拓扑结构 项目需求 主机环境描述 实验步骤 一、密钥互信和主机名更改 二、DNS 三、NGINX 四、MARIADB 五、NFS 六、NTP 七、论坛服务 结果展示及痛点解答 实验分析 环境拓扑结构 项目需求 1. 172.25.250.101 主机上的 Web 服务要求提供 www.ex…...
备赛蓝桥杯之第十五届职业院校组省赛第二题:分享点滴
提示:本篇文章仅仅是作者自己目前在备赛蓝桥杯中,自己学习与刷题的学习笔记,写的不好,欢迎大家批评与建议 由于个别题目代码量与题目量偏大,请大家自己去蓝桥杯官网【连接高校和企业 - 蓝桥云课】去寻找原题࿰…...
MyBatis 注解开发详解
MyBatis 注解开发详解 MyBatis 支持使用注解来进行数据库操作。注解方式将 SQL 语句直接写在 Java 接口中,通过注解来完成 CRUD(增删改查)操作,省去了使用 XML 配置的繁琐步骤。这种方式适合简单项目或快速原型开发,因…...
Kivy App开发之UX控件VideoPlayer视频播放
kivy使用VideoPlayer控件实现视频播放,可以控制视频的播放,暂停,音量调节等功能。 在使用VideoPlayer视频播放器时,可以参考下表属性来设置其样式和触发事件。 属性说明source视频路径,默认为空state视频状态,值play,pause,stop,默认为stopthumbnail显示视频的缩略图…...
简单排序算法
异或运算及异或运算实现的swap方法 ^(异或): ^运算是计算机中的位运算,运算规则为相同为0,不同为1(也被称为无进位相加)。位运算处理效率比常规运算符效率更高。 异或运算遵循的法则: 0^N N N^N 0 异或运算…...
C语言初阶牛客网刷题——JZ17 打印从1到最大的n位数【难度:入门】
1.题目描述 牛客网OJ题链接 题目描述: 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。 用返回一个整数列表来代替打印n 为正整数,0 < n < 5 示例1 输入&…...
基于springboot+vue的校园二手物品交易系统的设计与实现
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...
开发环境搭建-2:配置 python 运行环境(使用 uv 管理 python 项目)
在 WSL 环境中配置:WSL2 (2.3.26.0) Oracle Linux 8.7 官方镜像 UV 介绍 uv软件官网(github 需要梯子,没错这个软件的官网真就是 github 页面):https://github.com/astral-sh/uv 中文官网(github 需要梯…...
STM32 ST7735 128*160
ST7735 接口和 STM32 SPI 引脚连接 ST7735 引脚功能描述STM32 引脚连接(示例,使用 SPI1)SCLSPI 时钟信号 (SCK)PA0(SPI1_SCK)SDASPI 数据信号 (MOSI)PA1 (SPI1_MOSI)RST复位信号 (Reset)PA2(GPIO 手动控制)DC数据/命令选择 (D/C)PA3 (GPIO 手…...
【面试总结】FFN(前馈神经网络)在Transformer模型中先升维再降维的原因
FFN(前馈神经网络)在Transformer模型中先升维再降维的设计具有多方面的重要原因,以下是对这些原因的总结: 1.目标与动机 高维映射空间:FFN的设计目的是通过一系列线性变换来拟合一个高维的映射空间,而不仅…...
VB读写ini配置文件将运行文件放入任务计划程序设置为开机自启动
本示例使用设备: https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1bWmhJZJ&ftt&id562957272162 Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpAppl…...
Java基础 (一)
基础概念及运算符、判断、循环 基础概念 关键字 数据类型 分为两种 基本数据类型 标识符 运算符 运算符 算术运算符 隐式转换 小 ------>>> 大 强制转换 字符串 拼接符号 字符 运算 自增自减运算符 ii赋值运算符 赋值运算符 包括 强制转换 关系运算符 逻辑运算符 …...
数据结构——实验六·散列表
嗨~~欢迎来到Tubishu的博客🌸如果你也是一名在校大学生,正在寻找各种编程资源,那么你就来对地方啦🌟 Tubishu是一名计算机本科生,会不定期整理和分享学习中的优质资源,希望能为你的编程之路添砖加瓦⭐&…...
springboot网上书城
摘 要 在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括网上书城管理系统的网络应用,在国外网上书城管理系统已经是很普遍的方式,不过国内的书城管理系统可能还处于起步阶段。网上书城管理系统具有网上…...
如何在 Pytest 中使用命令行界面和标记运行测试
关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 在前文你已经初步尝试编写了代码和单元测试,并且想要确保它能正常运行。…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
一些实用的chrome扩展0x01
简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序,无论是测试应用程序、搜寻漏洞还是收集情报,它们都能提升工作流程。 FoxyProxy 代理管理工具,此扩展简化了使用代理(如 Burp…...
2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...
