深入理解面向對象設計的七大原則

一.面向對象設計的七大原則是什么?

1.開放封閉原則

2.里氏轉換原則

3.依賴倒轉原則

4.組合/聚合原則

5.接口隔離原則

6.“迪米特”法則

7.單一職責原則

二.七大原則是什么含義?

序號

面向對象設計七大原則

偶的理解

1

開放封閉原則

面向擴展開放,面向修改關閉

2

里氏轉換原則

超類存在的地方,子類是可以替換的

3

依賴倒轉原則

實現盡量依賴抽象,不依賴具體實現

4

組合/聚合原則

要盡量使用合成/聚合達到復用,而不是繼承關系達到復用的目的。

5

接口隔離原則

應當為客戶端提供盡可能小的單獨的接口,而不是提供大的總的接口

6

“迪米特”法則

又叫最少知識原則,一個軟件實體應當盡可能少的與其他實體發生相互作用

7

單一職責原則

每一個類應該專注于做一件事情

?

三.解讀七大原則:

1.開放封閉原則

偶的理解

偶是做底層的設計與編碼,譬如:車載導航系統的引擎的。該引擎系統包括地圖數據格式的解析,圖層添加、修改、刪除等;地圖符號的編輯、顯示與潤色,基于兩個地點之間的最短時間/最短距離的路徑規劃等等功能。

?

做車載導航系統的應用層的同事,不能修改偶核心層代碼,也就是說您不能修改偶的接口,但是您可以針對偶的接口做一些擴展。也就是:對接口的修改是封閉,但是對接口的擴展是開放。

為什么這樣?

1.同事修改偶的核心層代碼不合適,畢竟這些偶是專門整天研究這個的,偶專業呀;

2.同事為了自己的一己私利,修改了接口(如添加參數,修改了參數數據類型或者去掉某個參數),但是基于偶的核心車載導航引擎的,不只同事一個人用,好多同事與第三方公司都編譯不過,一堆會找上門來,罵你個狗血噴頭;

3.但是同事,將偶的引擎接口擴展了,自己用,影響不到其他人,多好的一件事情;

2.里氏轉換原則

任何基類可以出現的地方,子類一定可以出現。即超類存在的地方,子類是可以替換的。替換后行為不變,結果會變化。調用子類行為。

子類和父類必須有相同行為才能完全地實現替換。

實現開閉原則的關鍵是抽象化,而里氏代換原則中的基類和子類的繼承關系正是抽象化的具體體現,所以里氏代換原則是對實現抽象化的具體步驟的規范。違反里氏代換原則

偶的理解

想通過基類的指針,調用虛擬函數,搞多態,讓一個函數,針對不同的派生類指針,會有不同的表現行為。派生類的虛擬函數,不能搞特殊。派生類的指針不能賦值給基類,哪就胡扯。

?

里氏代換原則是要求我們在使用繼承時,必須滿足一定的條件。不能為了復用,一味去繼承。

3.依賴倒轉原則

抽象不應該依賴細節。細節應該依賴抽象。

偶的理解

設計接口的時候,不應該說俺設計的這一個接口,就是給這個某一個具體實現功能而設計。

哪就不叫面向對象設計了,抽象了也啥意思。因為你只為某一個具體功能而設計。

?

但是具體編碼實現某一個功能,還是要依賴于某一具體的接口的。

?

注意這是面向對象設計,設計什么呢?設計接口。接口是一個一對多的關系。一對多啥意思,就是一個接口,有多種實現。

?

哦!明白了。多態,講的就是這個意思,一個接口,多種行為方式。掛上鉤了。O(∩_∩)O~。

類似:活著與吃飯的關系

活著不是為了吃飯,但是吃飯為了活著。

4.組合/聚合原則

偶的理解

《設計模式》里23個模式,就是整篇整篇地講如何類與類之間的組合/聚合。

?

如果為了復用,便使用繼承的方式將兩個不相干的類聯系在一起,違反里氏代換原則,哪是生搬硬套,忽略了繼承了缺點。

?

繼承的缺點有:

?

1、繼承復用破壞數據封裝性,將基類的實現細節全部暴露給了派生類,基類的內部細節常常對派生類是透明的,白箱復用。

雖然簡單,但不安全,不能在程序的運行過程中隨便改變。

?

2、基類的實現發生了改變,派生類的實現也不得不改變。

?

3、從基類繼承而來的派生類是靜態的,不可能在運行時間內發生改變,因此沒有足夠的靈活性。

5.接口隔離原則

應當為客戶端提供盡可能小的單獨接口,而不要提供大的總接口。暴露行為讓后面的實現類知道的越少越好。

偶的理解

人家需要什么,你給人家提供什么。

否則如果接口給人家提供多了,暴露多了,自己的麻煩不少。人家會問:

1.這個接口是干什么的,怎么用啊;

2.這個接口與另外一個接口有什么區別啊?又有什么聯系啊?什么情況下用這個接口,什么情況下用另外一個接口;

?

總之,問得你煩死了,煩透了。最后,沒辦法,只好弄一個版本,就是提供客戶需要的接口,告訴他如何使用,一了百了。清閑自在多了。

?

真是你好!我好!大家好!

?

一旦某個漂亮的女孩子穿衣服,要是暴露多了,又露胸,又露屁股,被人家一陣狂扁,“看哪個不要臉的狐貍精”,“傷風敗俗,缺家教”,“看又一個暴露狂”。搞的人家MM都要奔潰,跳黃河自殺。偶算明白了。技術原理來源于生活。道理都是相通的。O(∩_∩)O~

6.“迪米特”法則

又叫最少知識原則,一個對象對另一個對象知道的越少越好,即一個軟件實體應當盡可能少的與其他實體發生相互作用。

?

如果兩個類不必彼此直接通信,那么這兩個類就不應當發生直接的相互作用。如果其中一個類需要調用另一個類的某一方法的話,可以通過第三者轉發這個調用。

偶的理解

一個類包裝好自己的private狀態和方法,不需要讓別的類知道字段或者行為,就不要公開喲!

?

強調類之間的松耦合。

?

類與類之間的耦合性越低,一旦一個處于弱耦合的類的代碼被修改了,不會對有關系的類造成波及與影響。這樣,這個類的復用性大大增強,提高了開發效率,降低了出錯的可能性。

?

哥最怕的是修改了某一個不起眼的類一點代碼,跟她發生關系的類太多。牽一發而動全身。會發生多米諾效應。咱可惹不起。誰知道,會出現什么后果!汗顏!

7.單一職責原則

每一個類應該專注于做一件事情。

偶的理解

這個講的就是商業領域里面的定位概念。想打官司,找律師;想看病,找醫生;想學習,找老師。

?

一個類一個具體作用,如微軟的VC?MFC里的CBrush、CPen、CFont等就是這個意思,想搞字體用CFont,想用畫筆用CPen,想用刷子,用CBrush。各司其責,一目了然。

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

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

相關文章

mybatis實戰教程(mybatis in action)之二:以接口的方式編程

前面一章,已經搭建好了eclipse,mybatis,mysql的環境,并且實現了一個簡單的查詢。請注意,這種方式是用SqlSession實例來直接執行已映射的SQL語句:session.selectOne("com.yihaomen.mybatis.models.UserMapper.selectUserByID&…

Linux內核分析06

進程的描述和進程的創建 一,進程的描述 進程控制塊PCB——task_struct (進程描述符),為了管理進程,內核必須對每個進程進行清晰的描述,進程描述符提供了內核所需了解的進程信息。 struct task_struct數據結…

【pyqt5學習】——pyqt5中.qrc資源文件的創建與編寫

目錄 一、說明 二、安裝pyqt5以及相關工具(pyqt5、pyuic、pqrcc) 三、創建.ui文件 1、選中文件右鍵-external-pyqt5 打開GUI設計界面 2、創建一個界面(內含四個等大label框) 3、CTRLS保存 4、找到ui文件,右鍵--e…

zabbix3.0.4通過jmx監控tomcat

jdk下載頁面http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htmlhttp://download.oracle.com/otn-pub/java/jdk/8u91-b14/jdk-8u91-linux-x64.rpm?AuthParam1462948138_871b75d4b1dd7155e8cbe4f23e5cd2cd腳本[rootNFS-WEB1 latest]# vim /e…

C#學習筆記——25個經典問題

1.靜態成員和非靜態成員的區別? 2.const 和 static readonly 區別? 3.extern 是什么意思? 4.abstract 是什么意思? 5.internal 修飾符起什么作用? 6.sealed 修飾符是干什么的? 7.override 和 o…

PHP的學習--RSA加密解密

PHP服務端與客戶端交互或者提供開放API時,通常需要對敏感的數據進行加密,這時候rsa非對稱加密就能派上用處了。 舉個通俗易懂的例子,假設我們再登錄一個網站,發送賬號和密碼,請求被攔截了。 密碼沒加密,那攻…

Swift學習

1、Swift網址 http://swiftdoc.org/ 2、 https://github.com/ipader/SwiftGuide 轉載于:https://www.cnblogs.com/superbobo/p/5329876.html

【pyqt5學習】——最新版:配置external tools(designer、pyuic、pqrcc)

目錄 1、pip install PyQt5 2、pip install pyqt5-tools 3、file-settings-tools-external tool 點擊加號定義工具名字,名字隨意便于區分即可 雙擊每一個工具名字,配置路徑(注意每一個exe的路徑) designer.exe pyuic.exe py…

Linux中vi命令詳解

最近vi用的多,很多技巧不知道,備注一份, vi編輯器是所有Unix及Linux系統下標準的編輯器,它的強大不遜色于任何最新的文本編輯器,這里只是簡單地介紹一下它的用法和一小部分指令。由于 對Unix及Linux系統的任何版本&…

C# 屬性和字段

以下的文章是摘錄的,作者已經不詳了。之所以摘錄,是因為這個概念很重要特別對于VFP程序員來說,這里構造屬性就與vfp的方法完全不同。c#的屬性融合了vfp的addproperty() 和屬性的access method和assign method 。不一而足使用屬性&#xff0c…

SEO優化---學會建立高轉化率的網站關鍵詞庫

想要優化好一個網站,行業的分析,以及關鍵詞的挖掘是必要的,有一定的關鍵詞排名了,但是轉化率和流量方面卻很不理想這種情況大部分是只注重了有指數的關鍵詞排名,而忽略了長尾關鍵詞和一些沒有指數但是可以帶來巨大流量的關鍵詞。 網站大部分的…

Monkey腳本編寫

腳本優勢:簡單、快捷、不需要借助任何工具,可以做簡單的性能測試 腳本缺點:只能簡單實現坐標、按鍵等基本操作,無邏輯性 腳本格式: 腳本API: 例子: 打開瀏覽器,輸入WWW.jikexueyuan.…

C#通過DllImport引入dll中的C++非托管類

首先從msdn了解到,DllImport是用來 將特性化方法由非托管動態鏈接庫 (DLL) 作為靜態入口點公開。 從以上語句我們可以理解出三點:1.C編寫的非托管dll可以通過DllImport引入到C#中;2.引入到C#中的只能是C方法(或者說函數&#xff0…

USB 設備類協議入門【轉】

本文轉載自:http://www.cnblogs.com/xidongs/archive/2011/09/26/2191616.html 一、應用場合USB HID類是比較大的一個類,HID類設備屬于人機交互操作的設備。用于控制計算機操作的一些方面,如USB鼠標,USB鍵盤,USB游戲操…

lucene之Field屬性的解釋

Field類 數據類型 Tokenized是否分詞 Indexed 是否索引 Stored 是否存儲 說明 StringField(FieldName, FieldValue,Store.YES)) 字符串 N Y Y或N 這個Field用來構建一個字符串Field,但是不會進行分析,會將整個串存儲在索引中,比如…

【機器視覺】——焦距計算物體實際尺寸計算

目錄 1.基本概念 2.像素尺寸(piex)轉為實際尺寸(mm) 3.焦距計算

Tableview中Dynamic Prototypes動態表的使用

Tableview時IOS中應用非常廣泛的控件,當需要動態的添加多條不同的數據時,需要用動態表來實現,下面給出一個小例子,適用于不確定Section的數目,并且每個Section中的行數也不同的情況,適合新手。首先&#xf…

c# - 聲明事件

1 事件是屬于一個特定的類的,其本質是只能在此類中調用的委托。 從面向對象的角度出發,事件是對象對某個消息的響應,因此其聲明必然只能在類的級別出現,且不可用static修飾。 2 事件其實和屬性差不多,是一種特殊的方法…

appium 環境搭建 java

1 安裝node.js 1.1 安裝node.js http://nodejs.cn/download/ 1.2、下載后直接點擊exe,按照提示一步一步的安裝 1.3 安裝成功后,運行cmd,輸入node –v,如果安裝成功,會輸出如下版本信息 2 eclipse android開發環境搭建 2.1 用eclip…

【數據庫bug修復】——Authentication plugin ‘caching_sha2_password‘ is not supported

目錄 原因 連接數據庫的時候出現這個問題的解決方法 創建數據庫連接池時解決方法 原因 使用客戶端鏈接mysql數據庫,如果數據庫版本高于8.0,可能出現以上問題,因為8.0以前默認使用mysql_native_password身份驗證機制,8.0以后使用…