設計模式—單一職責原則

1.背景

單一職責原則(SRP:Single responsibility principle)又稱單一功能原則,面向對象五個基本原則(SOLID)之一。它規定一個類應該只有一個發生變化的原因。該原則由羅伯特·C·馬丁(Robert C. Martin)于《敏捷軟件開發:原則、模式與實踐》一書中給出的。馬丁表示此原則是基于湯姆·狄馬克(Tom DeMarco)和Meilir Page-Jones的著作中的內聚性原則發展出的。

2.概念

就一個類而言,應該僅有一個引起它變化的原因。應該只有一個職責。每一個職責都是變化的一個軸線,如果一個類有一個以上的職責,這些職責就耦合在了一起。這會導致脆弱的設計。當一個職責發生變化時,可能會影響其它的職責。另外,多個職責耦合在一起,會影響復用性。此原則的核心就是解耦和增強內聚性。

通俗的講:

方法級別的單一職責原則:一個方法只負責一件事

類級別的單一職責原則: 一個類只負責一件事

類庫級別的單一職責原則:一個類庫應該職責清晰

項目級別的單一職責原則:一個項目應該職責清晰(客戶端、管理后臺、后臺服務、任務調度服務、分布式引擎)

系統級別的單一職責原則:為通用功能拆分子系統(日志系統、權限系統、存儲系統)

3.針對的場景

有一個類T負責兩個不同的職責:職責P1和職責P2。當因為職責P1的需求發生改變而需要修改類T的時候,有可能會導致原本運行正常的職責P2功能發生故障。

舉例:下面示例中一個圖片加載類負責3個不同的職責:圖片下載、保存到緩存、圖片顯示

public class ImageLoader {/*** 下載*/public Bitmap download(String url){Bitmap bitmap = null;// 下載圖片//...return bitmap;}public void displayImage2(ImageView imageView, String url){Bitmap bitmap = download(url);// 圖片顯示//...// 圖片緩存imageCache(bitmap);}public void imageCache(Bitmap bitmap){// 圖片緩存//...}
}

4.解決方案

遵循單一職責原則,分別建立兩個類T1、T2,使T1完成職責P1功能,T2完成職責P2功能。這樣,當修改類T1的時候,不會使職責P2發生故障風險。同理,當修改T2的時候,也不會使職責P1發生故障風險。

舉例:針對上面案例中的代碼,我們進行優化,我們把圖片下載、保存到緩存、圖片顯示這幾個職責定義成單獨類,而不是一個類全搞定。

/*** 下載類*/
public class Download {/*** 下載** @param url 下載地址* @return 圖片*/public Bitmap download(String url) {Bitmap bitmap = null;System.out.println("下載圖片");return bitmap;}
}
/*** 緩存類*/
public class Cache {/*** 緩存圖片* @param bitmap 圖片*/public void imageCache(Bitmap bitmap){System.out.println("緩存圖片");}
}
/*** 圖片加載類*/
public class ImageLoader {/*** 3加載圖片* @param imageView 圖片控件* @param url 圖片地址*/public void displayImage3(ImageView imageView, String url){Download download = new Download();Bitmap bitmap = download.download(url);// 圖片顯示System.out.println("顯示圖片");//...// 圖片緩存Cache cache = new Cache();cache.imageCache(bitmap);}
}

5.優點

  • 降低類的復雜度,一個類只負責一個職責。

  • 提高類的可讀性,提高系統的可維護性。

  • 降低變更引起的風險。變更是必然的,如果單一職責原則遵守得好,就可以達到職責/功能的解耦。

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

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

相關文章

生成式AI與大語言模型,東軟已經準備就緒

伴隨著ChatGPT的火爆全球,數以百計的大語言模型也爭先恐后地加入了這一戰局,掀起了一場轟轟烈烈的“百模大戰”。毋庸置疑的是,繼方興未艾的人工智能普及大潮之后,生成式AI與大語言模型正在全球開啟新一輪生產力革新的科技浪潮。 …

【C語言】深入理解指針(四)

🌈write in front :🔍個人主頁 : 啊森要自信的主頁 ??真正相信奇跡的家伙,本身和奇跡一樣了不起啊! 歡迎大家關注🔍點贊👍收藏??留言📝>希望看完我的文章對你有小小的幫助&am…

帝國cms開發一個泛知識類的小程序的歷程記錄

#帝國cms小程序# 要開發一個泛知識類的小程序,要解決以下幾個問題。 1。知識內容的分類。 2。知識內容的內容展示。 3。知識內容的價格設置。 4。用戶體系,為簡化用戶的操作,在用戶進行下載的時候,請用戶輸入手機號&#xff…

【HarmonyOS】API6上JS實現視頻播放全屏播放時,會回到之前界面

【關鍵字】 API6 / 視頻播放 / 全屏播放異常 【問題現象】 開發者在API6上用JS實現視頻播放器點全屏播放后,不是全屏效果,實際效果是變成了橫屏并返回到首頁。 具體代碼實現是參考video媒體組件指南。 【問題分析】 JS實現視頻播放器有Codelab代碼示…

DedeBIZ 管理系統 DedeV6 v6.2.6 社區版 免費授權版

DedeBIZ 系統:開源、安全、高效的 DedeV6 v6.2.6 社區版 DedeBIZ 系統是基于 PHP 7 版本開發的,具有強大的可擴展性,并且完全開放源代碼。它采用現流行的 Go 語言設計開發,不僅擁有簡單易用、靈活擴展的特性,還具備更…

ElasticSearch之Health API

查看當前集群全部健康指標的信息,執行如下命令: curl -X GET "https://localhost:9200/_health_report?pretty" --cacert $ES_HOME/config/certs/http_ca.crt -u "elastic:ohCxPHQBEs5*lo7F9"執行結果輸出如下: {&quo…

Niushop 開源商城 v5.1.7:支持PC、手機、小程序和APP多端電商的源碼

Niushop 系統是一款基于 ThinkPHP6 開發的電商系統,提供了豐富的功能和完善的商品機制。該系統支持普通商品和虛擬商品,并且針對虛擬商品還提供了完善的核銷機制。同時,它也支持新時代的商業模式,如拼團、分銷和多門店砍價等營銷活…

Platform Issues 平臺問題

Set processing does not behave the same on every database platform. On some platforms, set processing can encounter performance breakdowns. Some platforms do not optimize update statements that include subqueries. 集處理在每個數據庫平臺上的行為并不相同。在…

Log4j

通過Log4j,我們可以控制日志信息輸送到目的地是控制臺、文件、GUI組件,甚至是套接口服務器、NT的事件記錄器。我們可以控制每一條日志的輸出格式。通過定義每一條日志信息的級別,能更加細致地控制日志的生成過程。 1 log4j、log4j2與SLF4J …

【Vue3從入門到項目實現】前置知識及Vue基礎

概念 理論基礎 MVC 架構(以JavaWeb舉例) M :Model,(pojo、service、dao等)V :View,(JSP, HTML等)C:Controller (servlet) MVVC 架構&#xff…

C/C++ 使用API實現數據壓縮與解壓縮

在Windows編程中,經常會遇到需要對數據進行壓縮和解壓縮的情況,數據壓縮是一種常見的優化手段,能夠減小數據的存儲空間并提高傳輸效率。Windows提供了這些API函數,本文將深入探討使用Windows API進行數據壓縮與解壓縮的過程&#…

【Rust日報】2023-11-21 如何將 Rust 的編譯效率提高 75%

這是一篇來自 https://benw.is/posts/how-i-improved-my-rust-compile-times-by-seventy-five-percent 的總結和翻譯,我去掉了一些不太重要的章節,保留了所有關鍵技術點。 Rust經常被提到的一個痛點是編譯時間較慢。為了享受借用檢查器、安全性和零成本抽…

pikachu靶場Table pikachu.member doesn’t exist:解決

背景: 第一次搭建pikachu靶場,搭建好后訪問index.php后,嘗試練習,發現界面顯示Table pikachu.member doesn t exist,后來找了很多教程,沒有解決,后來發現是自己沒有進行初始化,給大家…

VMware 系列:ESXI6.7升級7.0

ESXI6.7升級7.0 一、下載補丁二、上傳文件三 啟用Shell四、登錄Shell后臺五、刪除不兼容驅動六、正常升級最近,將一臺使用ESXI6.7的虛擬機升級到了7.0版本,下面記錄一下自己的升級過程。 升級條件 首先確保硬件是否能升級到7.0版本,物理網卡驅動為e1000e不能升級,如果是ig…

不到十個例題帶你拿下c++雙指針算法(leetcode)

移動零問題 https://leetcode.cn/problems/move-zeroes/submissions/ 1.題目解析 必須在原數組進行修改,不可以新建一個數組 非零元素相對順序不變 2.算法原理 【數組劃分】【數組分塊】 這一類題會給我們一個數組,讓我們劃分區間,比如…

【機器學習】Nonlinear Independent Component Analysis - Aapo Hyv?rinen

Linear independent component analysis (ICA) x i ( k ) ∑ j 1 n a i j s j ( k ) for all i 1 … n , k 1 … K ( ) x_i(k) \sum_{j1}^{n} a_{ij}s_j(k) \quad \text{for all } i 1 \ldots n, k 1 \ldots K \tag{} xi?(k)j1∑n?aij?sj?(k)for all i1…n,k1…K()…

VUE語法-$refs和ref屬性的使用

1、$refs和ref屬性的使用 1、$refs:一個包含 DOM 元素和組件實例的對象,通過模板引用注冊。 2、ref實際上獲取元素的DOM節點 3、如果需要在Vue中操作DOM我們可以通過ref和$refs這兩個來實現 總結:$refs可以獲取被ref屬性修飾的元素的相關信息。 1.1、$refs和re…

PS_魔幻

首先打開一個背景圖片 然后ctrl j復制一層背景 在調整中將圖片改成黑白顏色 點擊調整中的 色相/飽和度 調整明度 點擊畫筆工具,并且設置畫筆模板 調節畫筆大小,將筆記本電腦涂個概況 然后再新建色相/飽和度 勾選著色 調節背景顏色至喜歡 右鍵混合選項 …

04-React腳手架 集成Axios

初始化React腳手架 前期準備 1.腳手架: 用來幫助程序員快速創建一個基于xxx庫的模板項目 1.包含了所有需要的配置(語法檢查、jsx編譯、devServer…)2.下載好了所有相關的依賴3.可以直接運行一個簡單效果 2.react提供了一個用于創建react項目的腳手架庫…

【華為OD機試python】分糖果【2023 B卷|100分】

【華為OD機試】-真題 !!點這里!! 【華為OD機試】真題考點分類 !!點這里 !! 題目描述 小明從糖果盒中隨意抓一把糖果,每次小明會取出一半的糖果分給同學們。 當糖果不能平均分配時,小明可以選擇從糖果盒中(假設盒中糖果足夠) 取出一個糖果或放回一個糖果。 小明最少需要多…