java設計模式之開閉原則使用舉例

1. 輸入法皮膚擴展(抽象類實現)

場景:用戶可為輸入法更換不同皮膚(如默認皮膚、CSDN皮膚)。
實現:

  • 抽象層:定義抽象類AbstractSkin,聲明皮膚顯示方法。
  • 擴展:新增皮膚只需繼承抽象類并實現方法,無需修改輸入法主類。
// 抽象皮膚類
public abstract class AbstractSkin {public abstract void display();
}
// 具體皮膚類
public class DefaultSkin extends AbstractSkin {@Overridepublic void display() { System.out.println("默認皮膚"); }
}
public class CSDNSkin extends AbstractSkin {@Overridepublic void display() { System.out.println("CSDN皮膚"); }
}
// 輸入法類(依賴抽象)
public class SouGouInput {private AbstractSkin skin;public void setSkin(AbstractSkin skin) { this.skin = skin; }public void display() { skin.display(); }
}

擴展性:新增TheodoreSkin時,僅需編寫新子類,調用setSkin()即可生效。


2. 圖形繪制系統(多態替代條件判斷)

問題:原始代碼通過if-else判斷圖形類型,新增圖形需修改核心邏輯(違反OCP)。

// 違反OCP的原始代碼
class GraphicEditor {void drawShape(Shape s) {if (s.m_type == 1) drawRectangle(s);else if (s.m_type == 2) drawCircle(s);}
}

改進:抽象類Shape定義draw()方法,子類實現具體邏輯。

// 遵循OCP的改進代碼
abstract class Shape { abstract void draw(); }
class Rectangle extends Shape { @Override void draw() { System.out.println("繪制矩形"); }
}
class Triangle extends Shape { @Override void draw() { System.out.println("繪制三角形"); }
}
// 調用方無需修改
class GraphicEditor { void drawShape(Shape s) { s.draw(); }
}

優勢:新增圖形只需添加子類,無需改動GraphicEditor


3. 支付方式擴展(策略模式)

場景:支持微信、支付寶等支付方式,新增支付方式時無需修改核心邏輯。
實現:

  • 接口定義:聲明支付行為。
  • 擴展:新增支付類實現接口,通過工廠動態創建。
// 支付接口
public interface Payment {void pay();
}
// 具體支付類
public class WeChatPay implements Payment {@Override public void pay() { System.out.println("微信支付"); }
}
// 支付工廠(擴展時新增工廠方法)
public class PaymentFactory {public static Payment create(String type) {if ("wechat".equals(type)) return new WeChatPay();// 擴展支付寶:新增條件分支else if ("alipay".equals(type)) return new AliPay();return null;}
}

擴展性:新增AliPay類后,僅需擴展工廠邏輯,調用方代碼不變。


4. 動物行為擴展(接口隔離)

場景:統一管理不同動物的共同行為(如eat()),擴展行為時不影響原有邏輯。

// 動物接口
public interface Animal {void eat();
}
// 具體動物類
public class Cat implements Animal {@Override public void eat() { System.out.println("貓吃魚"); }// 新增行為(如sleep()):僅擴展當前類,不影響其他動物public void sleep() { System.out.println("貓睡覺"); }
}

說明:新增行為通過擴展具體類實現,接口保持穩定。


5. 圖形面積計算(從硬編碼到抽象)

問題:原始代碼通過instanceof判斷圖形類型,新增圖形需修改計算邏輯。

// 違反OCP的原始代碼
double calculateArea(Object shape) {if (shape instanceof Circle) { /* 計算圓面積 */ }else if (shape instanceof Rectangle) { /* 計算矩形面積 */ }
}

改進:定義Shape接口,子類實現計算邏輯。

// 遵循OCP的改進代碼
interface Shape { double calculateArea(); }
class Circle implements Shape { @Override double calculateArea() { return Math.PI * radius * radius; }
}

擴展性:新增Triangle類實現接口,計算邏輯無需修改主類。


總結:開閉原則的核心實踐

  1. 抽象化:通過接口或抽象類定義穩定框架。
  2. 多態擴展:新增功能通過實現子類完成。
  3. 設計模式結合:工廠、策略模式等增強擴展性。
  4. 降低耦合:調用方依賴抽象而非具體實現。
    通過上述案例可見,開閉原則顯著提升了代碼的可維護性和擴展性,是構建靈活系統的基礎。

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

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

相關文章

Spark Shuffle機制原理

文章目錄1.什么是Shuffle?2.Shuffle解決什么問題?3.Shuffle Write與Shuffle Read4.Shuffle的計算需求4.1 計算需求表4.2 partitionby4.3 groupByKey4.4 reduceByKey4.5 sortByKey5.Shuffle Write框架設計與實現5.1 Shuffle Write框架實現的功能5.2 Shuffle Write的多種情況5.…

Cursor vs Trae vs VSCode:2025終極IDE橫評,誰才是開發者的效率之選?

前言 2025年的編程世界,AI不再只是輔助,而是編程工作流的核心驅動者。從微軟的VSCode 到新銳 Cursor 與國產黑馬 Trae ,三大 IDE 正在重新定義“人機協作”的邊界。本文從架構設計、AI能力、場景適配等維度,帶你看透工具本質&…

Vue 安裝指定版本依賴包、刪除某個依賴包、依賴管理

如何安裝指定版本的依賴包安裝指定版本:一旦你知道了想要的版本號,比如3.4.0,你可以使用以下命令來安裝這個版本的vue-router:npm install vue-router3.4.0 --save這里的^表示安裝3.4.0的最新小版本更新,但不會超過主版…

psycopg2 如何驗證鏈接是否有效

在 psycopg2 中,驗證數據庫連接是否有效(即連接是否仍然活躍)可以通過以下幾種方法實現:1. 使用 conn.closed 屬性 psycopg2 的連接對象有一個 closed 屬性,可以檢查連接是否已關閉: import psycopg2conn …

數據科學與計算-電商雙11美妝數據分析

一、項目背景:雙 11 美妝數據的價值所在 每年的 “雙 11” 購物節都是電商行業的盛宴,而美妝品類作為消費熱門領域,蘊含著豐富的用戶行為與市場趨勢信息。該項目聚焦雙 11 期間的美妝電商數據,旨在通過數據分析揭示以下核心問題&…

簡單了解MongoDB數據存儲

官方文檔:MongoDB中文手冊|官方文檔中文版 | MongoDB-CN-Manual 什么是MongoDB? MongnDB是一個分布式文件存儲數據庫(或叫文檔數據庫),是一個介于 關系數據庫和非關系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數…

web網站開發,在線%射擊比賽成績管理%系統開發demo,基于html,css,jquery,python,django,model,orm,mysql數據庫

經驗心得 這個也是crud業務單子,第二個聊點其他的,從最早的無分層開發,到三層開發,工廠,各種接口,再到后面多層,代碼無痕aop,各種框架等,都是在方便我們快速打架一個程序…

[QtADS]解析ads.pro

本文來源 : 騰訊元寶subdirs : 子目錄TEMPLATE subdirs的作用????核心功能??:聲明當前項目為“多項目管理”模式。Qt 的構建系統(qmake)會遍歷 SUBDIRS中列出的子目錄,在每個子目錄中尋找 .pro文件并遞歸構建。…

三方相機問題分析六:【沒用相機,詭異的手電筒不可使用】下拉狀態欄,手電筒置灰,無法打開,提提示相機正在使用

【關注我,后續持續新增專題博文,謝謝!!!】 上一篇我們講了: 這一篇我們開始講: 三方相機問題分析六:【沒用相機,詭異的手電筒不可使用】下拉狀態欄,點擊手電筒,手電筒置灰,無法打開,提提示相機正在使用9348353 目錄 一、問題背景 二、:問題分析過程 2.1:基于…

Java Selenium 自動打開瀏覽器保存截圖

// 代碼 public class ScreenshotExample {public static void main(String[] args) {// 1. 設置瀏覽器驅動路徑(根據實際路徑修改)System.setProperty("webdriver.chrome.driver", "D:\\chromedriver-win64\\chromedriver.exe");//…

新商機:為了減少輻射,可以用座機打機房中心再轉手機

某些人痛恨自家附近有基站,說是輻射太大。你不能說人家迷信。一般解決辦法就是拆基站。而我覺得,商機來了。現在座機基本沒人裝了。新商機就是座機。附近沒有基站,又要打電話,怎么辦?裝座機。用座機打電話時&#xff0…

【Java|第十九篇】面向對象九——String類和枚舉類

&#xff08;四&#xff09;面向對象11、String類&#xff08;1&#xff09;概述<1>String是一個類&#xff0c;引用數據類型&#xff0c;用來表示字符串&#xff1b;<2>String是Lang包下的類&#xff0c;使用不需要導包&#xff1b;<3>字符串的值不能變&…

超越相似名稱:Elasticsearch semantic text 如何在簡潔、高效、集成方面超越 OpenSearch semantic 字段

作者&#xff1a;來自 Elastic Mike Pellegrini, Nick Chow 及 Libby Lin 比較 Elasticsearch 語義文本和 OpenSearch 語義字段在簡潔性、可配置性和效率方面的表現。 自己動手體驗向量搜索&#xff0c;使用這個自定進度的 Search AI 實操學習。你現在可以開始免費的云試用&am…

OpenAI發布最新大模型GPT5、本地部署GPT開源模型

OpenAI發布最新大模型GPT5、本地部署GPT開源模型 GPT-5概述 北京時間 2025年8月8日 凌晨1點 OPENAI舉行了1個小時的線上發布會&#xff0c;正式推出了其史上最聰明、最強大的大模型GPT-5。 GPT-5是OpenAI發布的最新一代大型語言模型&#xff0c;它基于Transformer架構&#xff…

容器網絡模式選擇在云服務器多節點部署中的連通性驗證方案

容器網絡模式選擇在云服務器多節點部署中的連通性驗證方案在云計算環境中&#xff0c;容器網絡模式的選擇直接影響著多節點部署的通信效率和安全性。本文將從Docker原生網絡驅動對比入手&#xff0c;深入分析Overlay、Host、Bridge等主流網絡模式在跨主機通信場景下的性能表現&…

電商雙11美妝數據分析

1、數據初步了解2.數據清洗2.1 重復值處理 直接刪除重復值。2.2 缺失值處理通過上面觀察數據發現sale_count,comment_count 存在缺失值,先觀察存在缺失值的行的基本情況存在的缺失值很可能意味著售出的數量為0或者評論的數量為0&#xff0c;所以我們用0來填補缺失值。2.3 數據挖…

Pytest項目_day14(參數化、數據驅動)

parametrize 參數化可以組裝測試數據。在測試前定義好測試數據&#xff0c;并在測試用例中使用 單參數單次循環 我們可以在裝飾器中使用mark.parametrize&#xff0c;來定義參數名和參數值列表 參數名還需要傳給函數參數名需要用字符串來定義&#xff0c;參數值列表需要用可迭代…

Nest.js、Knex.js、Nuxt.js、Next.js 和 Spring Boot的異同相關概念

總述Nest.js、Knex.js、Nuxt.js、Next.js 和 Spring Boot 是分屬不同技術領域的工具&#xff0c;涵蓋前端框架、后端框架、數據庫工具等角色&#xff0c;它們在開發中既有功能交集&#xff0c;也有明確的定位差異。一、相同點服務端參與能力五者均能在服務端發揮作用&#xff1…

第2節 大模型分布式推理架構設計原則

大模型推理系統的設計過程,本質上是在多重約束下尋找最優解的過程。硬件資源的物理限制、場景對性能的剛性要求、系統的可擴展性需求,共同構成了設計的邊界條件。明確這些約束的具體表現形式,理解性能指標之間的權衡邏輯,確立架構設計的核心原則,是構建高效分布式推理系統…

快速部署一個鑒黃服務

1.安裝依賴pip install opennsfw22.代碼實現import opennsfw2 as n2# 將自動下載預訓練模型 open_nsfw_weights.h5 到 C:\Users\Administrator\.opennsfw2\weights # pip install opennsfw2# 單張預測 image_path 1.jpg nsfw_probability n2.predict_image(image_path) print…