【設計模式 00】設計模式的六大原則

設計模式的六大原則

參考:

  • 設計模式六大原則

1. 單一職責原則

一個類只負責一個明確的功能

優點:

  • 降低類的復雜度,提高代碼可讀性和可維護性
  • 降低變更時對其他功能的影響

2. 里氏替換原則

**原則一:**若 o1 是 C1 的一個實例化對象, o2 是 C2 的一個實例化對象,如果在使用 C1 的程序中將o1 替換為 o2 而程序行為沒有發生變化,那么 C2 應該是 C1 的子類。

**原則二:**所有用到基類對象的地方,如果把基類對象替換成子類對象,程序行為不應該發生變化。

實現方法:

  1. 子類可以實現父類的抽象方法,但不能覆蓋父類的非抽象方法;
  2. 允許子類拓展父類的方法
  3. 當子類的方法重載父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入參數更寬松。
  4. 當子類的方法實現父類的抽象方法時,方法的后置條件(即方法的返回值)要比父類更嚴格。

3. 依賴倒置原則

高層模塊不應該依賴低層模塊,二者都應該依賴其抽象;抽象不應該依賴細節;細節應該依賴抽象。

比如手機(Phone)依賴CPU,那么 Phone 就是一個高層模塊, CPU 就是一的低層模塊,Phone 顯然不應該依賴一個具體的低層模塊(如 Qualcomm865):

public class Phone {private Qualcomm cpu;Phone(){this.cpu = new Qualcomm();}public void printConfig(){System.out.println("cpu is" + this.cpu);}
}

不管是高通還是麒麟,都應該抽象為一個CPU類,然后各自實現,高層模塊只依賴于抽象的低層模塊。

實現方法:

  1. 低層模塊盡量都要有抽象類或接口,或者兩者都有。
  2. 變量的聲明類型盡量是抽象類或接口。
  3. 使用繼承時遵循里氏替換原則。

4. 接口隔離原則

客戶端不應該依賴它不需要的接口;一個類對另一個類的依賴應該建立在最小的接口上。

使用多個隔離的接口,比使用單個接口要好.

接口隔離原則

5. 迪米特法則

一個對象應該對其他對象保持最少的了解。

高內聚,低耦合

6. 開閉原則

對拓展開放,對修改封閉:當系統變化時,盡量通過拓展來實現變化,而不是去修改原有代碼;

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

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

相關文章

pb retrieve時停止工作_大佬們掛在嘴邊的PE、PB是什么?

在緊鑼密鼓地準備科創50ETF的發行工作間隙,今天小夏先帶你讀懂最簡單的PE、PB估值指標這兩大指標。01、什么是PE(市盈率)PE,也就是市價盈利比率,簡稱市盈率。市盈率是指股票價格與每股收益(每股收益&#x…

EF CodeFirst 如何通過配置自動創建數據庫當模型改變時

最近悟出來一個道理,在這兒分享給大家:學歷代表你的過去,能力代表你的現在,學習代表你的將來。 十年河東十年河西,莫欺少年窮 學無止境,精益求精 本篇為進階篇,也是彌補自己之前沒搞明白的地方,…

對AutoIt中控件和窗口的理解

經過嘗試,對AutoIt中Control和Window有了新的認識,分享一下 1.Control 現在我想對一個WinForm架構的應用程序進行自動化操作,得到控件Advanced Mode屬性為[Name:XXX]。 然而在該窗口中有多個相同屬性的Control,而依該屬性只能操作…

【設計模式 01】簡單工廠模式(Simple factory pattern)

簡單工廠模式 可以根據參數的不同返回不同類的實例 參考: CSDN|簡單工廠模式 簡單工廠通過傳給工廠類的參數的不同,返回不同的對象,包括三部分組成: 具體的”產品“工廠類(實例化并返回”產品“)客戶端&am…

[Hadoop]MapReduce多路徑輸入與多個輸入

1. 多路徑輸入 FileInputFormat是所有使用文件作為其數據源的 InputFormat 實現的基類,它的主要作用是指出作業的輸入文件位置。因為作業的輸入被設定為一組路徑, 這對指定作業輸入提供了很強的靈活性。FileInputFormat 提供了四種靜態方法來設定 Job 的…

pvrect r語言 聚類_R語言實現KEGG通路富集可視化

用過KEGG的朋友應該都很熟悉里面的通路地圖。你是否想過如果自己可以控制通路圖將自己的基因繪制在一個通路圖中,那么今天給大家介紹一個新推出的Bioconductor軟件包pathview。這個包可以進行KEGG富集分析。首先,我們不耐煩的介紹下Bioconductor包的安裝…

【設計模式 02】策略模式( Strategy)

策略模式 參考: CSDN | 策略模式百家號 | 策略模式 如果某個系統需要不同的算法(如超市收銀的優惠算法),那么可以把這些算法獨立出來,使之之間可以相互替換,這種模式叫做策略模式,它同樣具有三個…

PL/SQL復合變量

復合變量可以將不同數據類型的多個值存儲在一個單元中。由于復合類型可以由用戶自己根據需要定義其結構,所以復合數據類型也稱為自定義數據類型。在PL/SQL中,使用%TYPE聲明的變量類型與數據表中字段的數據類型相同,當數據表中字段數據類型修改…

Android中使用am命令實現在命令行啟動程序詳解

在Android中,除了從界面上啟動程序之外,還可以從命令行啟動程序,使用的是命令行工具am. 復制代碼代碼如下:usage: am [subcommand] [options] start an Activity: am start [-D] -D: enable debugging send a broadcast Intent: am br…

用Visual Studio 2019連接 WSL來編譯調試C/C++項目

因為有作業要在Linux環境下寫,用虛擬機直接卡成PPT,VS code又不會調試,就搞一下VS 2019吧。 環境 windows 10 WSL(Ubuntu 18.04.4) Visual Studio Community 2019 Linux 里要有C/C環境(gcc等)VS要有 適用于 Linux…

node.js Websocket消息推送---GoEasy

Goeasy, 它是一款第三方推送服務平臺,使用它的API可以輕松搞定實時推送!個人感覺goeasy推送更穩定,推送速度快,代碼簡單易懂上手快瀏覽器兼容性:GoEasy推送支持websocket 和polling兩種連接方式,從而可以支…

git 移動分支指針_理解git 中的HEAD指針branch指針

HEAD指針使用git checkout 來移動HEAD指針,移動的對象可以是分支指針也可以是快照。HEAD指針可以指向快照也可以指向branch。當指向branch時提交后會和branch指針一起向后移動,當不指向branch提交時時則會在一個detached狀態。分支(branch)指針使用git b…

應用程序域

好文鏈接 使用.NET建立的可執行程序 .exe,并沒有直接承載到進程當中,而是承載到應用程序域(AppDomain)當中。應用程序域是.NET引入的一個新概念,它比進程所占用的資源要少,可以被看作是一個輕量級的進程。 …

【設計模式 03】裝飾模式——俄羅斯套娃?

裝飾模式(俄羅斯套娃?) 裝飾模式:動態的給某些對象添加額外的功能 參考: 簡書 | 裝飾模式 博客園 | 簡說設計模式——裝飾模式 博客園 | 裝飾器模式 Decorator 結構型 設計模式 (十) 什么是裝飾模式 裝飾模式也叫裝飾器模式,p…

系統移植的四大步驟

最近在學習系統移植的相關知識,在學習和調試過程中,發現了很多問題,也解決了很多問題,但總是對于我們的開發結果有一種莫名其妙的感覺,糾其原因,主要對于我們的開發環境沒有一個深刻的認識,有時…

bem什么意思_bem是什么意思_bem的翻譯_音標_讀音_用法_例句_愛詞霸在線詞典

全部Methods Three different concentrations of the n - butanol extract of MOH ( BEM ) : 0.038 g L ~ ( - 1 ), 0.11 g L ~ ( - 1 ) and 0.34 g L ~ ( - 1 ) were prepared.巴戟天醇提取物 ( BEM ) 配成含生藥0.038gL~ ( -1)、0.11gL~ ( -1 ) 、 0.34gL~ ( -1 ) 三種濃度…

display:flex

flex:彈性布局 常用屬性介紹: flex-direction: column (設置主容器主軸方向) flex-flow: row wrap (第一個參數為flex-direction,第二個為flex-wrap) align-items: flex-start (設…

Linux(Ubuntu 19.10)下 Qt5 連接 MySQL(QMYSQL driver not loaded)

Linux(Ubuntu 19.10)下 Qt5 連接 MySQL 安裝好 MySQL 和 Qt Qt 連接 MySQL 的代碼 QSqlDatabase dQSqlDatabase::addDatabase("QMYSQL");//加載mysql驅動,這個字符串是固定的 d.setHostName("127.0.0.1"); d.setDatabas…

華為消息推送 有透傳通道嗎_求解在推送用透傳消息-使用廠商通道(我用的是基座測試) 用手機測試出現了“clientId離線”問題...

// #ifdef APP-PLUS// uni.showModal({// title: 提示,// content: 您的用戶在其它的app登錄,如果有問題,請修改密碼或重新登錄!,// cancelText:"修改密碼",// confirmText:"好的",// success: function (res) {// if (r…

oneuijs/You-Dont-Need-jQuery

oneuijs/You-Dont-Need-jQuery https://github.com/oneuijs/You-Dont-Need-jQuery/blob/master/README.zh-CN.mdYou Dont Need jQuery 前端發展很快,現代瀏覽器原生 API 已經足夠好用。我們并不需要為了操作 DOM、Event 等再學習一下 jQuery 的 API。同時由于 React…