C++設計模式:面向物件設計原則
面向物件設計
變化是複用的天敵,而面向物件設計的最大優勢就是抵禦變化
面向物件設計原則
1.依賴倒置關係(DIP)
- 高層模組(穩定)不應該依賴於底層模組(變化),二者都應該依賴於抽象(穩定)
- 抽象(穩定)不應該依賴於實現細節,實現細節應該依賴於抽象(穩定)
如上節 C++設計模式<一>:簡介中的例子
其中MainForm(高層模組)應該是穩定的,而第一種方案(分解模式)卻依賴於Line和Rect(底層模組);
然而第二種方案(抽象設計模式)MainForm(高層模組)依賴於Shape(抽象),且Line和Rect(底層)也依賴於Shape(抽象),但是注意抽象不應該依賴於底層;這樣就實現了隔離變化
2.開放封閉原則(OCP)
- 對擴充套件開放,對更該封閉
- 類模板應該是可擴充套件的,但是不可修改
對於需求變化,我們不應該去想著到處去更改,而是去新增,擴充套件
3.單一職責原則(SRP)
- 一個類僅有一個引起它變化的原因
- 變化的方向隱含著類的責任
類太多的原則,太多的責任,太多的方法,不正常。
4.Liskov替換原則
- 子類必須能夠替換它們的基類(is-a)
- 繼承表達型別抽象
所有需要父類的地方,子類(因為子類is-a父類)都可以傳過去,都可以使用。
繼承了父類,發現父類的方法有幾個不能用了,這就違背了這個原則。
5.介面隔離原則(ISP)
- 不應該強迫客戶程式依賴它們不用的方法
- 介面應該小而完備
不需要把不必要的方法public,如果是本類使用的話就private,如果是子類使用的話就protected。
6.優先使用物件組合,而不是類繼承
- 類繼承通常為“白箱複用”,物件組合通常為“黑箱複用”
- 繼承在某種程度上破環了封裝性,子類父類耦合度高
- 而物件組合則只要求被組合的物件具有良好的介面,耦合度低
7. 封裝變化點
- 使用封裝來建立物件之間的分界層,讓設計者可以在分界層的一側進行修改,而不會對另一側產生不良影響,從而實現層次間的鬆耦合
- [x] 底層來看:封裝就是資料和方法封裝成類
- [ ] 高層來看:我也還不懂,因此需要學習呀。
8. 針對介面程式設計,而不是針對實現程式設計
- 不將變數型別宣告為某個特定具體類,而是某個介面(這個當然不是絕對的)
- 客戶程式無需獲知物件的具體型別,只需要知道物件所知道的介面。
- 減少系統中各部分的依賴關係,從而實現“高內聚,鬆耦合”的型別設計方案
其實軟體就是分工協助的工作,因此介面標準化很重要,這也是一個產業強盛的標誌。
將設計原則提升為設計經驗
- 設計習語 Design Idioms
- Design Idioms描述與特定程式語言相關的底層模式,技巧,慣用法
- 設計模式 Design Patterns
- Design Patterns主要描述的是 “類與相互通訊的物件之間的組織關係,包括它們的角色,職責,協作方式等方面”
- 架構模式 Architectural Patterns
- Architectural Patterns描述系統中基本結構組織關係密切的高層模式,包括子系統劃分,職責,以及如何組織它們之間關係規則
相關推薦
C++設計模式:面向物件設計原則
面向物件設計 變化是複用的天敵,而面向物件設計的最大優勢就是抵禦變化 面向物件設計原則 1.依賴倒置關係(DIP) 高層模組(穩定)不應該依賴於底層模組(變化),二者都應該依賴於抽象(穩定) 抽象(穩定)不應該依賴於實現細節,實現
設計模式:面向物件設計的六大原則 (絕對詳細)
目錄 前言 六大原則 單一職責原則 開閉原則 里氏替換原則 依賴倒置原則 介面隔離原則 迪米特原則 總結
C#設計模式前奏-面向物件設計原則
在學習設計模式之前,面向物件設計原則是必須要了解的東西。因為大多數設計模式都遵循這些設計原則中的一種或者多種。今天就帶大家一起去學習學習七類面向設計原則。首先列出常用的7中面向物件
【設計模式】面向物件六大原則
主要內容 關於面向物件六大原則 單一職責原則(Single Responsibility Principle) 縮寫為SRP。 對於一個類而言,應該僅有一個引起它變化的原因。或者說一個類中應該是一組相關性很高的函式、資料的封裝。大意就是一個類應該只做一件事情,這就是職
Java設計模式之——面向物件六大原則
面向物件六大原則: 設計模式六大原則(1):單一職責原則 設計模式六大原則(2):開閉原則 設計模式六大原則(3):里氏替換原則 設計模式六大原則(4):依賴倒置原則 設計模式六大原則(5):介面隔離原則 設計模式六大原則(6):迪米特原則 設計模式六大
設計模式之面向物件七大基本原則
PS一句:最終還是選擇CSDN來整理髮表這幾年的知識點,該文章平行遷移到CSDN。因為CSDN也支援MarkDown語法了,牛逼啊! 概述 在運用面向物件的思想進行軟體設計時,需要遵循的原則一共有7個,他們是: 1. 單一職責原則(Single R
java設計模式:面向對象設計的7個原則
ron 依賴倒置原則 步驟 計算機 適應性 抽象類 oops 關閉 sla 在軟件開發中,為了提高軟件系統的可維護性和可復用性,增加軟件的可擴展性和靈活性,程序員要盡量根據7條原則來開發程序,從而提高軟件開發效率,節約軟件開發成本和維護成本。 這7條原則分別是:開閉原則、
SOLID:面向物件設計的五個基本原則
在程式設計領域,SOLID 是由羅伯特·C·馬丁在 21 世紀早期引入的記憶術首字母縮略字,指代了面向物件程式設計和麵向物件設計的五個基本原則。當這些原則被一起應用時,它們使得一個程式設計師開發一個容易進行軟體維護和擴充套件的系統變得更加可能。**SOLID** 是以下五個單詞的縮寫: - Single R
effective C++筆記--繼承與面向物件設計(二)
文章目錄 絕不重新定義繼承而來的非虛擬函式 絕不重新定義繼承而來的預設引數值 通過複合塑模出has-a或“根據某物實現出” 明智而審慎地使用private繼承 明智而審慎地使用多重繼承 絕不重新定義繼承而來的非虛擬函式
effective C++筆記--繼承與面向物件設計(一)
文章目錄 確定你的public繼承塑模is-a關係 避免遮掩繼承而來的名字 區分介面繼承和實現繼承 考慮virtual函式以外的其他選擇 由Non-Virtual Interface(NVI)手法實現Template Method模
程式語言入門及進階、設計模式、面向物件書籍
1. Python Python 基礎教程 Automate the Boring Stuff with Python(繁瑣工作自動化) 前六章,python 語言基礎; 其後便是一些自動化實現
Effective C++之繼承與面向物件設計
5.條款之避免繼承而來的名稱 int x; void someFunc() { double x; std::cin >> x; } 我們都知道上面這段程式碼會因為區域性變數的原因,輸入的x是double型別的 根據以上程式碼,我們來看看下面的類: #in
【設計模式】面向物件小結——重寫與過載
通過對《大話設計模式》附錄的學習,讓我對面向物件技術有了更深一層的理解!下面是我畫的一張導圖,是我對面向物件技術的總體概括。這篇文章的主要內容,就是圍繞這張圖,來講述我的理解。。
更適用於JavaScript的設計模式:面向委托的設計,了解一下?(下)
對象 角度 實現 log 缺陷 面向 相對 rip light 先來看一下傳統的面向類式的寫法: function Foo(name) { this.name = name; } Foo.prototype.sayName = function() {
我的設計模式:從模版設計模式談到建造者模式
模版設計模式 建造者模式 導演模式 1.模版設計模式 TemplateMethod Pattern問題:創建模型,如何處理更好?有共性有異性,共性放在哪裏(abstract)?異性放在哪裏(實現)? 缺陷:暴露方法好嗎?protected保護起來 方法不會被子類繼承修改final
設計模式:講在設計模式之前
通過 組合 支付寶 .com atp mon 情況下 基本功 代碼量 一、什麽是設計模式 1、設計模式的定義 2、註意事項 設計模式就是底層實現起來麻煩,上層調用簡單 設計模式就是“有一個套路 ,分幾個類,幾個方法,幾個屬性” 3、為什麽要有設計模式 在面向對象之前用的面
設計模式:單例設計模式
內部 建議 null 需要 餓漢 重排序 let sin 網站 單例設計模式 由於某些類創建對象可能會耗費內存和花費時間。一般將這種類設計為單例設計模式會比較好。 1.對象在內存中只有一個,減少了內存的開銷 2.可以控制對象的創建時刻 單例模式的特點: 1.單例的類在整個J
組合還是繼承,這是一個問題?——由模式談面向物件的原則之多用組合、少用繼承
組合還是繼承,這是一個問題 ——由模式談面向物件的原則之多用組合、少用繼承剛剛接觸模式或者學習模式的人,經常
PHP設計模式:類自動載入、PSR-0規範、鏈式操作、11種面向物件設計模式實現和使用、OOP的基本原則和自動載入配置
一、類自動載入 SPL函式 (standard php librarys) 類自動載入,儘管 __autoload() 函式也能自動載入類和介面,但更建議使用&nbs
Java設計模式1:面向物件程式設計的四大特徵和設計模式的六大原則
這篇博文算是對《設計模式之禪》的讀書筆記。這本書寫得非常好,通俗易懂,強烈推薦!另外,也參考了很多其他的資料,包括http://www.runoob.com/design-pattern/design-pattern-tutorial.html以及網上一些部落格等,再次表示感