【設計模式】 原則

單一職責原則

對于一個類而言,有且僅有一個引起他變化的原因或者說,一個類只負責一個職責

如果一個類承擔的職責過多,那么這些職責放在一起耦合度太高了,一個職責的變化可能會影響這個類其他職責的能力。

所以我們在做軟件設計的時候,要發現職責,并且把這些職責互相分開

例子1

對于看書這件事情,用手機看書和直接看紙質書相比,肯定紙質書的效率要高一些。

因為手機的職責太多了,接打電話、聽歌、看電視劇等等,我們在看書的時候,可能收別的職責的影響。

而紙質書,只有一個職責,沉浸式讀書。

例子2

電腦機箱中,由CPU、內存、硬盤、顯卡、主板等等。

假設我們的CPU、內存、應該、顯卡是高層模塊,電腦中應該叫易插拔,都插到主板中。

對于電腦這個主體而言,就符合單一職責原則,內存條壞了,不會影響CPU、磁盤和主板。

開閉原則

對擴展開發,對修改封閉【多擴展、少修改】

當我們面對新需求的時候,對程序的修改只是通過增加代碼的方式,而不用去修改已有的代碼。

這樣做我們程序變得更加,可擴展、可維護、可服用、靈活性。

例子

假設現在我們由兩個模塊,一個是高層模塊(做業務邏輯模塊),一個底層模塊(數據庫模塊)。

數據庫的一些常見操作比如:增刪改查,但是我們使用的數據庫可以是MySQL、SQLServer、Postgresql等等。

那么如果做到開閉原則吶,抽象出一個類,如果新加了數據庫去繼承這個類,然后自己去實現增刪改查接口。

這樣就做到了對擴展開發,對修改封閉了。

依賴倒置原則

高層模塊不應該依賴于底層模塊,他們都應該依賴于抽象

我們要針對接口編程,而不是針對實現編程

例子1

電腦舉例,CPU、內存、硬盤、顯卡都應該依賴于抽象接口,而不是依賴于具體的主板。

如果依賴于具體的主板,那么主板壞了,這些高層的設備都用不了了,這樣設計顯然不合理。

例子2

還是上面那個例子,高層模塊(業務邏輯層)和底層模塊(數據庫層)都不應該互相依賴,而是依賴于抽象。

高層模塊 => 抽象 => 低層模塊

抽象其實就是基類,底層模塊是子類。

MySQL、SQLServer、PostgreSQL都有增刪改查操作,假設有一天要用到別的數據庫

只需要再創建一個類,繼承抽象去實現這些接口,對于高層模塊而言,不需要任何的改變(或者只需要改變new的對象而已)

里氏替換原則

子類必須能夠替代父類
例子

假設鳥是父類,那么鴕鳥和企鵝能繼承于鳥類嗎?

如果按照初中老師講的,鴕鳥和企鵝雖然不能飛,但是屬于鳥類。

但是再我們編程的世界里面,如果鴕鳥和企鵝可以繼承鳥類,這是不合理的,違反了里氏替換原則。

還是舉一個例子,他們的高層模塊 => 抽象 => 低層模塊

如果抽象中要使用的方法就是鳥的會飛的方法,但是我們底層模塊是鴕鳥,根本不會飛,這樣就會產生嚴重的錯誤

所以里氏替換原子是實現依賴倒置原則的基礎

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

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

相關文章

windows11右鍵菜單新增項增加drawio文件,使用draw.io

目錄1.新建空白模板2.建立注冊表文件1.新建空白模板 這里我們的模板文件路徑為 D:\Software\drawio\template.drawio 2.建立注冊表文件 首先新建一個.txt文件,我這里取名為menulize.txt,然后將下面的內容復制到.txt文件中 Windows Registry Editor Ver…

解鎖網頁魔法:零基礎HTML通關秘籍

文章目錄**解鎖網頁魔法:零基礎HTML通關秘籍**HTML 基礎目標HTML 結構認識 HTML 標簽HTML 文件基本結構標簽層次結構快速生成代碼框架HTML 常見標簽注釋標簽注釋的原則標題標簽: h1-h6段落標簽: p換行標簽:br綜合案例: 展示博客超鏈接標簽: a表格標簽**基…

類似 Pixso 但更側重「網頁 / 軟件界面設計」「前后端可視化開發」的工具

從 GoView 的 Demo 功能來看,它主要聚焦于數據可視化大屏的低代碼搭建,更側重數據圖表配置和頁面布局,沒有類似 Pixso 的在線 UI 設計(如矢量繪圖、組件樣式精細化設計)功能,其核心是通過預設組件快速構建數…

MySQL--組從復制的詳解及功能演練

2.MySQL的組從復制 2.1 配置mastesr [rootmysqlaa ~]# vim /etc/my.cnf [mysqld] server-id10 datadir/data/mysql socket/data/mysql/mysql.sock default_authentication_pluginmysql_native_password log-binmysql-bin[rootmysqlaa ~]# /etc/init.d/mysqld restart# 進入數據…

JavaScript將String轉為base64 筆記250802

JavaScript將String轉為base64 筆記250802 在 JavaScript 中將字符串轉換為 Base64 編碼有多種方法,每種方法都有其適用場景。下面我將全面介紹這些方法,包括處理 ASCII 字符、Unicode 字符以及性能優化方案。 基礎方法:btoa() 基本用法&a…

Unity3D數學第四篇:射線與碰撞檢測(交互基礎篇)

Unity3D數學第一篇:向量與點、線、面(基礎篇) Unity3D數學第二篇:旋轉與歐拉角、四元數(核心變換篇) Unity3D數學第三篇:坐標系與變換矩陣(空間轉換篇) Unity3D數學第…

數據處理和統計分析——09 數據分組

1 聚合 1.1 簡介 在SQL中我們經常使用GROUP BY將某個字段,按不同的取值進行分組,在Pandas中也有groupby()函數;分組之后,每組都會有至少1條數據,將這些數據進一步處理返回單個值的過程就是聚合,比如分組之后…

【數據結構與算法】數據結構初階:排序內容加餐(一)——快速排序:三路劃分、自省排序

🔥個人主頁:艾莉絲努力練劍 ?專欄傳送門:《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題 🍉學習方向:C/C方向 ??人生格言:為天地立心,為生民立命,為…

MySqL(加餐)

范式第一范式數據庫表的每一列都是不可分割的原子數據項,而不能是集合,數組,對象等非原子數據。在關系型數據庫的設計中,滿足第一范式是對關系模式的基本要求。不滿足第一范式的數據庫就不能被稱為關系數據庫。第一范式實際上只要…

【redis】基于工業界技術分享的內容總結

Redis 實踐指南與核心概念 一、Java 中常用的 Redis 使用場景與實踐 緩存(Caching) 場景:熱點數據、頻繁訪問的數據,如商品詳情、用戶信息。通過緩存減少數據庫壓力,提高系統響應速度。 工業界實踐: 淘寶…

服務端之nestJS常用異常類及封裝自定義響應模塊

MENU前言常用異常類(由nestjs/common提供)示例自定義異常(可選)自定義響應模塊前言 在NestJS中,nestjs/common提供了大量的內置異常類,主要用于在控制器、服務等層拋出特定的HTTP錯誤響應。 常用異常類&…

數據鏈路層、NAT、代理服務、內網穿透

目錄 一. 以太網 以太網幀格式 二. MAC地址 三. MTU 四. ARP協議 五. NAT NAPT 六. 代理服務器 正向代理 反向代理 七. 內網穿透 八. 內網打洞 一. 以太網 ? "以太網" 不是一種具體的網絡, 而是一種技術標準; 既包含了數據鏈路層的內 容, 也包含了一些物理層…

Rust在CentOS 6上的移植

Rust已不支持Cent OS 6 rhel是Redhat 發布的Red Hat Enterprise Linux的簡稱,使用rhel源代碼編譯的CentOS,最新的版本是CentOS 7,于2024年停止支持。而更古老的CentOS 6,則在2020年就已經結束了。 而面對如此老舊的系統&#xf…

C++音視頻開發:基礎面試題

音視頻領域技術門檻高,學習資料稀缺,體系化書籍和開發工具有限,新手入門困難。音視頻開發涉及眾多任務:音頻(采集、編解碼、降噪等)、視頻(采集、編解碼、圖像處理)、實時傳輸&#…

C++刷題 - 7.27

貪心算法的詳細邏輯這個問題的最優解可以用 貪心算法 在 O(N) 時間 內解決。它的核心思想是:每次操作盡可能覆蓋最長的連續非零區間,并通過數學分析發現:最小操作次數等于所有“上升臺階”的高度差之和。1. 直觀理解假設 steps [1, 2, 3, 2,…

音頻3A處理簡介之AGC(自動增益控制)

在音頻通話和視頻會議中,音頻自動增益控制AGC模塊的主要作用:? 穩定音頻信號的輸出電平。無論麥克風采集信號的強弱(如用戶離麥克風遠近程度不同),盡可能保證音頻采集模塊的輸出音量保持相對一致,不會偏大…

web前端打包apk包

我用的是HBuilder工具,可視化更便捷,目前我這操作的apk包是不需要上架的,所以跟實際需要上架的可能還有些出入 首先先新建個項目,選擇5App模式 把目前需要打包的內容上傳到服務器,我們以嵌套的形式進行打包,找到index.…

Ansible提權sudo后執行報錯

1.問題 配置了sudo提權信息后,執行ansible-play報錯,報錯信息如下:2.原因 sudo沒有執行**/bin/sh的權限,而ansible腳本中依賴/bin/sh**,所以報錯了: 查看日志sudo tail -f /var/log/secure3.解決方式 修改*…

.NET報表控件ActiveReports發布v19.0——正式兼容 .NET 9

ActiveReports 是一款專注于 .NET 和 .NET Core 平臺的報表控件。通過拖拽式報表設計器,可以快速地設計 Excel表格、Word文檔、圖表、數據過濾、數據鉆取、精準套打等類型報表,全面滿足 WinForm、ASP.NET、ASP.NET MVC、WPF 平臺中各種報表的開發需要。同…

SCI論文選詞煉句

標準句子不能啰嗦;詞不能有問題,得是SCI中經常出現的,符合上下文的。SCI論文中常出現的摸棱兩可的詞單詞涵義例子Architecture指 整體系統設計方案,如網絡層次結構、模塊組合、激活函數選擇等深度學習模型架構Structure更泛泛&…