開閉原則(OCP)

非常棒的問題!🔍
開閉原則(OCP, Open/Closed Principle)是軟件設計的核心原則之一,下面我將從定義、意義、優劣分析、Python示例和結構圖五個方面完整解析給你。


🧠 什么是開閉原則?

開閉原則(OCP)對擴展開放(Open for extension),對修改關閉(Closed for modification)

也就是說:

  • 當新增功能時,你應該通過“增加代碼”來擴展系統功能;
  • 而不是“修改已有代碼”來實現。

🎯 為什么需要開閉原則?

原因說明
? 避免舊功能被破壞新功能以“新增方式”插入,避免改動原有邏輯
? 提高系統穩定性核心邏輯代碼不被輕易修改,降低出錯率
? 易擴展新業務需求只需擴展模塊,不影響舊模塊
? 配合抽象編程強化多態、接口、繼承等設計思想

🔍 優點 vs 缺點

優點缺點
系統可擴展性強初期設計較復雜
降低耦合需要較高的抽象能力
提升穩定性類和接口增多,維護成本略升

🐍 Python 示例

? 違反開閉原則的寫法

# 需求:計算圖形的面積,初期只有圓形,后續添加了矩形class AreaCalculator:def calculate(self, shape):if shape['type'] == 'circle':return 3.14 * shape['radius'] ** 2elif shape['type'] == 'rectangle':return shape['width'] * shape['height']

問題:每添加一個新圖形類型,就必須修改 calculate 方法,違反開閉原則。


? 遵守開閉原則的寫法(面向對象 + 多態)

from abc import ABC, abstractmethod# 抽象類
class Shape(ABC):@abstractmethoddef area(self):pass# 圓形
class Circle(Shape):def __init__(self, radius):self.radius = radiusdef area(self):return 3.14 * self.radius ** 2# 矩形
class Rectangle(Shape):def __init__(self, width, height):self.width = widthself.height = heightdef area(self):return self.width * self.height# 面積計算器
class AreaCalculator:def calculate(self, shape: Shape):return shape.area()# ? 使用
if __name__ == "__main__":circle = Circle(5)rectangle = Rectangle(4, 6)calculator = AreaCalculator()print("圓形面積:", calculator.calculate(circle))      # 輸出: 圓形面積: 78.5print("矩形面積:", calculator.calculate(rectangle))  # 輸出: 矩形面積: 24

? 新增圖形只需新增類,比如 Triangle,只需實現 .area() 方法,AreaCalculator 無需更改!


🧭 清晰邏輯圖(Mermaid)

?abstract?
Shape
+area()
Circle
+radius
+area()
Rectangle
+width
+height
+area()
AreaCalculator
+calculate(shape: Shape)

🏁 總結一句話:

“不要動舊代碼,直接加新代碼”就是開閉原則的核心。

它是現代框架設計(如Django、Flask插件系統、策略模式)的基礎,尤其適合用在:

  • 插件式架構
  • 策略選擇(多種支付方式、消息發送、折扣策略)
  • 工廠/注冊系統

如果你希望我進一步舉例,比如用開閉原則寫個“策略模式支付系統”或“數據導出系統(CSV, JSON, Excel)”,我也可以幫你畫一套結構+代碼~

要試試更復雜的實戰例子嗎?📦

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903868.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903868.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903868.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python數據分析(七):Pandas 數據變形與重塑

Pandas 數據變形與重塑全面指南 1. 引言 在數據分析過程中,我們經常需要將數據從一種結構轉換為另一種結構,以適應不同的分析需求。Pandas 提供了豐富的數據變形與重塑功能,包括旋轉(pivot)、堆疊(stack)、融合(melt)等多種操作。本文將詳細…

Android學習總結之jetpack組件間的聯系

在傳統安卓開發中,UI 組件(Activity/Fragment)常面臨三個核心問題: 生命周期混亂:手動管理 UI 與數據的綁定 / 解綁,易導致內存泄漏(如 Activity 銷毀后回調仍在觸發)。數據斷層&am…

C++初階:類和對象(二)

大家好,我是小卡皮巴拉 文章目錄 目錄 一.運算符重載 1.1 基本概念 定義 參數規則 特性 選擇原則 重載要點 二.類的默認成員函數 2.1 構造函數 構造函數的特點 2.2 析構函數 析構函數的特點 2.3 拷貝構造函數 拷貝構造的特點 2.4 拷貝賦值運算符重…

【c++】【STL】priority_queue詳解

目錄 priority_queue的作用priority_queue的接口構造函數emptysizetoppushpopswap priority_queue的實現仿函數(函數對象)是什么?向上調整算法(adjustup)向下調整算法(adjustdown)迭代器構造pus…

測試——用例篇

目錄 1. 測試用例 1.1 概念 2. 設計測試用例的萬能公式 2.1 常規思考逆向思維發散性思維 2.2 萬能公式 3. 設計測試用例例的方法 3.1 基于需求的設計方法 ?編輯 3.2 具體的設計方法 3.2.1 等價類 3.2.2 邊界值 3.2.3 正交法 3.2.4 判定表法 3.2.5 場景法 3.2.6…

銷售總監求職簡歷模板

模板信息 簡歷范文名稱:銷售總監求職簡歷模板,所屬行業:其他 | 職位,模板編號:KREUNY 專業的個人簡歷模板,邏輯清晰,排版簡潔美觀,讓你的個人簡歷顯得更專業,找到好工作…

AE腳本 關鍵幀緩入緩出曲線調節工具 Flow v1.5.0 Win/Mac

Flow是一個非常好用的After Effects腳本,它可以讓你更加輕松自如地調整關鍵幀的速度曲線,無需觸碰老舊復雜的圖形編輯器。 AE腳本介紹 Flow為After Effects帶來了一個簡潔的界面,使自定義動畫曲線變得十分容易,無需深入研究速度和影響力這些讓人困惑的概念 - 只需繪制一個曲線…

ACGRIME:用于全局優化和特征選擇的自適應混沌高斯RIME優化器,附完整版免費代碼

自然現象中,軟冰的形成過程由 Set al. [42] 提出,軟冰是空氣中的過冷水滴在接觸固體物體并凍結時形成的。這種現象發生在特定的氣候條件下,當水蒸氣尚未凝結時,導致冰覆蓋的表面呈現出獨特的樹枝狀和葉子狀景觀。它在軟冰的生長和…

大模型開發學習筆記

文章目錄 大模型基礎大模型的使用大模型訓練的階段大模型的特點及分類大模型的工作流程分詞化(tokenization)與詞表映射 大模型的應用 進階agent的組成和概念planning規劃子任務分解ReAct框架 memory記憶Tools工具\工具集的使用langchain認知框架ReAct框架plan-and-Execute計劃…

4.27-5.4學習周報

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 摘要Abstract一、方法介紹2.Rainbow Memory(RM)2.1多樣性感知內存更新2.2通過數據增強增強樣本多樣性(DA) 二、使用步驟1.實驗概況2.RM核心代碼 總結 摘要 本博客概…

AI Rack架構高速互連的挑戰:損耗設計與信號完整性的設計框架

在AI驅動的時代,系統設計已經從單一PCB的視角,逐步轉向以整個rack為單位來考量。 對于信號完整性而言,焦點以不再局限于單一PCB上的損耗,而是擴展到芯片與芯片之間的端到端互連損耗(end-to-end interconnect loss&…

杭電oj(1180、1181)題解

目錄 1180 題目 思路 問題概述 代碼思路分析 1. 數據結構與全局變量 2. BFS 函數 bfs 3. 主函數 main 總結 代碼 1181 題目 思路 1. 全局變量的定義 2. 深度優先搜索函數 dfs 3. 主函數 main 總結 代碼 1180 題目 思路 注:當走的方向和樓梯方向一…

軟件測試概念

這里寫目錄標題 需求開發模型軟件生命周期瀑布模型螺旋模型增量模型、迭代模型敏捷模型Scrum 測試模型V模型W模型(雙V模型) 需求 用戶需求:沒有經過合理的評估,通常就是一句話 軟件需求:是開發人員和測試人員執行工作…

數字基帶信號和頻帶信號的區別解析

數字基帶信號和數字頻帶信號是通信系統中兩種不同的信號形式,它們的核心區別在于是否經過調制以及適用的傳輸場景。以下是兩者的主要區別和分析: 1. 定義與核心區別 數字基帶信號(Digital Baseband Signal) 未經調制的原始數字信號…

Linux52 運行百度網盤 解決故障無法訪問repo nosandbox 未解決:疑似libstdc++版本低導致無法運行baidu網盤

昨日參考 哦 我是root Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64 沒了 計劃去手動下一個 還是不行 放棄 猜測是 centos7 過期了 一些依賴組件也沒地方下載了 通過阿里云鏡像站下載 之前安裝的好像不是這個版本 還是計劃用yum去下載依賴,先處…

2000-2022年上市公司數字經濟專利申請數據

2000-2022年上市公司數字經濟專利申請數據 1、時間:2000-2022年 2、來源:國家知識產權局 3、指標:年份、股票代碼、股票簡稱、行業名稱、行業代碼、省份、城市、區縣、行政區劃代碼、城市代碼、區縣代碼、首次上市年份、上市狀態、數字經濟…

機器學習之五:基于解釋的學習

正如人們有各種各樣的學習方法一樣,機器學習也有多種學習方法。若按學習時所用的方法進行分類,則機器學習可分為機械式學習、指導式學習、示例學習、類比學習、解釋學習等。這是溫斯頓在1977年提出的一種分類方法。 有關機器學習的基本概念,…

Chromium 134 編譯指南 - Android 篇:安裝構建依賴項(七)

1. 引言 歡迎來到《Chromium 134 編譯指南》系列的第七篇文章!在前面的章節中,我們已經成功獲取了Chromium源代碼,并將其配置為支持Android平臺。這些步驟為我們的編譯之旅奠定了堅實的基礎,但在開始實際編譯之前,我們…

java 進階 1.0

靜態方法 static 就是能直接用,不用再new一個對象了 一般java中Math等靜態類就是可以直接使用其方法 main函數里面不能包含太多的邏輯性語句,全部寫成模塊 寫好程序之后如何測試呢? 使用junit,不能在main函數里測試 測試本身就…

中小企業MES系統詳細設計

版本:V1.1 日期:2025年5月2日 一、設備協議兼容性設計 1.1 設備接入框架 #mermaid-svg-PkwqEMRIIlIBPP58 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-PkwqEMRIIlIBPP58 .error-icon{fill…