[設計模式] 設計模式課程(一)--面向對象設計原則
什麼是模式程序員
- 每一個模式描述了一個在咱們周圍不斷重複發生的問題及該問題的解決方案
- 「不須要從新發明輪子」
原則編程
面向對象設計模式
- 機器--程序員--現實世界
- 底層思惟:向下,如何把握機器底層從微觀理解對象構造
- 語言構造 / 編譯轉換 / 內存模型 / 運行時機制
- 抽象思惟:向上,如何將周圍世界抽象爲程序代碼
- 面向對象 / 組件封裝 / 設計模式 / 架構模式
- 三大機制
- 封裝:隱藏內部實現
- 繼承:複用現有代碼
- 多態:改寫對象行爲
- 深入把握面向對象機制帶來的抽象意義,理解如何用這些機制來表達現實世界,掌握什麼是「好的面向對象設計」
- 軟件設計複雜性的根本緣由:變化(客戶需求,技術平臺,開發團隊,市場環境)
兩種設計思路數據結構
面向對象設計架構
- 隔離變化:宏觀層面,減少變化帶來的影響
- 各負其責:微觀層面,強調各個類的「責任」,因爲需求變化致使的新增類型不該影響原類型(多態)
對象是什麼性能
- 語言層面:封裝了代碼和數據
- 規格層面:一系列可被使用的公共接口
- 概念層面:擁有某種責任的抽象
八大設計原則ui
- 依賴倒置:高層模塊(穩定)不該依賴於低層模塊(變化),兩者都依賴於抽象(穩定);抽象(穩定)不該依賴於細節(變化)(如MainForm和line都依賴於shape)
- 開放封閉:對擴展開放,對更改封閉;類模塊可擴展但不可修改(桌子廠刷塗料)
- 單一職責:一個類應僅有一個引發它變化的緣由,變化的方向隱含着類的責任
- 李氏替換:子類必須能替換它們的基類(is-a),父類的方法子類都要能用,繼承關係要與組合關係區分
- 接口隔離:接口小而完備,不要都public,子類protected,本類private
- 優先使用對象組合,而不是類繼承:繼承本質是類屬(組合)關係,簡單理解成父-子關係會致使錯誤使用(高耦合)
- 封裝變化點:一側變化,一側穩定,不僅是表面上的封裝代碼和數據
- 針對接口編程,而不是針對實現:不要將變量類型聲明爲具體類(業務類,string不算),而是聲明爲某個接口(如抽象類shape),實現高內聚,鬆耦合(舉例:秦兵器、活字印刷)
23種設計模式分類設計
- 從目的看
- 建立型:應對需求變化爲對象建立帶來的衝擊,在建立對象的同時隱藏建立邏輯
- 結構型:應對需求變化爲對象結構帶來的衝擊,關注類和對象的組合
- 行爲型:應對需求變化爲多個類交互過程當中責任劃分帶來的衝擊,關注對象間的通訊
- 從範圍看
- 類模式:處理類與子類的靜態關係,偏重繼承方案
- 對象模式:處理對象間的動態關係,偏重組合方案(一個類中包含另外一個類的對象或指針)
- 從封裝變化角度分類(黑體是必用的,斜體是不經常使用的)
- 組件協做:Template, Strategy, Observer/Event
- 單一職責:Decorator, Bridge
- 對象建立:Factory, Abstract Factory, Prototype, Builder
- 對象性能:Singleton, Flyweight
- 接口隔離:Facede, Proxy, Adapter, Mediator
- 狀態變化:Memento, State
- 數據結構:Composite, Iterator, Chain of Responsibility
- 行爲變化:Command, Visitor
- 領域問題:Interpreter
重構得到模式指針
- 面向對象設計模式是「好的面向對象設計」,便可以知足「應對變化,提升複用」的設計
- 現代軟件設計的特徵是「需求頻繁變化」,設計模式應「尋找變化點,而後在變化點處應用設計模式」(封裝變化點)(能看出代碼哪裏是穩定的,哪裏是變化的)「何時、地點應用設計模式」比「理解設計模式結構自己」更重要
- 設計模式應用不宜先入爲主,一上來就使用設計模式是對設計模式的最大誤用,沒有一步到位的設計模式,敏捷軟件開發提倡「Refactoring to Patterns」是目前公認的最好的使用設計模式的方法
重構關鍵技法orm
- 靜態->動態
- 早綁定->晚綁定
- 繼承->組合
- 編譯時依賴->運行時依賴
- 緊耦合->鬆耦合
書籍
- 《設計模式--可複用面向對象軟件的基礎》
- 《重構——改善既有代碼設計》
- 《重構與模式》
歡迎關注本站公眾號,獲取更多信息