設計模式:藍圖,現成的設計方案,可重用方案
《設計模式:可複用面向對象軟件的基礎》,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*,也是一個接口。
個人理解:只給用戶需要的,不給用戶多餘的,例如遙控器用不到很多功能。
例子:如果給客戶提供額外的不用的接口,他們一旦使用,當更改原有必用接口,
從而導致額外的接口用不了時。本沒有義務去修改,卻產生了不必要的麻煩。
而口頭的協商不保準的,從原則上,杜絕用到不必要或會產生麻煩串信息。