設計模式 第一課筆記

設計模式:藍圖,現成的設計方案,可重用方案

《設計模式:可複用面向對象軟件的基礎》,23種經典面向對象設計模式

 

設計模式≠面向對象設計模式,但現常指代後者

底層思維:運行機制、編譯轉換、內存模型等

抽象思維:面向對象、設計模式、架構模式等

 

面向對象

向下:三大面向對象機制,封裝、繼承、多態

向上:抽象意義,如何表達現實世界

 

軟件設計複雜的根本原因:變化

如客戶需求、技術平臺、開發團隊、市場環境等

 

如何解決複雜性

分解:分治,抽象爲小問題

抽象:忽視非本質細節,處理泛化和理想化對象模型

 

例子:

結構化&&抽象 實現一個 點 選中一個矩形 再放開鼠標代表選中 兩種方式對比

MFC 微軟基礎類庫

可見對Line和Rectangle分別討論,不如將其都視爲Shape,

這樣如果有添加Circle的後續操作,頭文件Shape.h內修改更方便

即應對變化時,提高代碼的可複用性

 

大學生知識體系要求:中國軟件工程知識體系《C-SWEBOK》

學習本課的目的:將其利用於實際生活中

 

面向對象設計的最大優勢:抵禦變化

宏觀層面:隔離變化,更能適應軟件變化,將影響減爲最小

微觀層面:各司其職,新增類不影響原有類的實現

 

23種具體設計模式:部分不再流行,被語言機制替代

設計原則比具體模式更重要,是使用和判別模式的關鍵,內化原則才能靈活使用

 

面向對象設計原則

(1)依賴倒置原則(DIP)

高層模塊(穩定)不應該依賴於底層模塊(變化),二者都應依賴於抽象(穩定)

抽象(穩定)不應該依賴於實現細節(變化),實現細節應該依賴於抽象(穩定)

 

如mainForm依賴於{Line,Rect,Circle},後者動態添加,故不穩定,違反依賴倒置原則

應改爲mainForm和{Line,Rect,Circle}都依賴於抽象類Shape

個人理解:穩定不應該依賴於變化的

 

(2)開放封閉原則(OCP)

對擴展開放,對更改封閉。

類模塊應該是可擴展的,但是是不可修改的。

個人理解:能在.h文件里加class,就不要在cpp裏改代碼重新編譯

不去毀掉原來的東西,添加一些東西,滿足變化帶來的要求

 

(3)單一職責原則(SRP)

一個類應該有一個引起它變化的原因。

變化的方向隱含着類的責任。

 

Rectangle類裏有一個area的計算面積的功能,有一個view的可視化功能。

更改這個類的一個功能勢必影響到另一個功能,而這是我們不想看到的,違反了單一職責原則。

更改方法:Rectangle類內只有一個area功能,再加一個新類繼承Rectangle,新類裏含Draw功能

 

(4)Liskov替換原則(LSP)

子類必須能夠替換他們的基類(IS-A)。

繼承表達類型抽象。

所有用到父類的地方,都可以用子類替代。

很簡單,若抽象類鳥裏有Fly函數,翠鳥可以繼承鳥,鴕鳥不會飛則不能繼承

 

(5)接口隔離原則(ISP)

不應該強迫客戶程序依賴他們不用的方法,接口應該小而完備。

mainForm用Shape*,也是一個接口。

個人理解:只給用戶需要的,不給用戶多餘的,例如遙控器用不到很多功能。

例子:如果給客戶提供額外的不用的接口,他們一旦使用,當更改原有必用接口,

從而導致額外的接口用不了時。本沒有義務去修改,卻產生了不必要的麻煩。

而口頭的協商不保準的,從原則上,杜絕用到不必要或會產生麻煩串信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章