1. 程式人生 > >設計模式——面向對象設計原則

設計模式——面向對象設計原則

指導 軟件設計 就會 3.5 做到 實現 分析 3.1 需求

設計模式——面向對象設計原則

技術分享圖片

1.什麽是面向對象設計

世界是具體的,認知是抽象的。像自然界中的生物、植物、動物一個個名詞,就是對一系列具體個體抽象出來的稱謂,而魚、老虎、樹等就是一個個實在的具體。哦,也許你會說,樹也是對一系列具體個體的抽象出來的稱謂,對也不對,對是因為樹確實是一系列具體個體的抽象稱謂,不對是因為照這個邏輯下去,就會陷入死循環,直到小到細胞,原子,誇克,但是你能保證誇克就是最小的具體嗎?還好前人已經幫我們解決這個思考了,通過繼承的關系,可以從抽象開始,逐層的繼承下去,就會形成一個具有抽象與具體關系的層次關系,就如同我們的世界那樣,也是通過抽象與具體形成的層次。

面向對象的設計實質是通過對現實世界提煉出符合需求的抽象封裝

,然後通過逐層繼承抽象並拓展實現,實現同一繼承來源然而變現多態性質。

比如下圖的繼承關系,這是遊戲的從最抽象出的對象,到角色、靜態采集物、場景,再到人物、寵物、怪、坐騎等,就是典型的面向對象設計。

技術分享圖片

2.為什麽需要面向對象設計

軟件設計就難的是應對變化、變化、變化。通過把系統功能封裝成一個個對象,就可以粒度細化、功能實現的耦合度低和職責獨立,細化了就能夠更好的把控;耦合度低就是高內聚、松耦合,能夠減少功能實現之間的關聯,降低修改的影響;職責單一獨立就能夠提高代碼復用,復用就能夠提高開發效率與提高可維護性。

為了能夠更好的實現面向對象設計,應該做到隔離變化,也就是把變與不變隔離開,不要讓變化的東西影響到不變的,適應軟件的變化。對象各有獨自的功能,也就是對象的功能要單一,新能功能類型不應該影響到舊的對象。這裏說的比較簡單,其實大師們已經總結出面向對象設計原則來指導我們的開發了。

3.面向對象設計原則

3.1依賴倒置原則

  • 高層模塊(穩定)不應該依賴於低層模塊(變化),二者都應該依賴於抽象(穩定) 。
  • 抽象(穩定)不應該依賴於實現細節(變化) ,實現細節應該依賴於抽象(穩定)。

3.2開閉原則

  • 對擴展開放,對更改封閉。
  • 類模塊應該是可擴展的,但是不可修改。

3.3單一職責原則

  • 一個類應該僅有一個引起它變化的原因。
  • 變化的方向隱含著類的責任。

3.4裏氏替換原則

  • 子類必須能夠替換它們的基類(IS-A)。
  • 繼承表達類型抽象。

3.5接口隔離原則

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

3.6優先使用對象組合,而不是類繼承

  • 類繼承通常為白箱復用
    ,對象組合通常為黑箱復用
  • 繼承在某種程度上破壞了封裝性,子類父類耦合度高。
  • 對象組合則只要求被組合的對象具有良好定義的接口,耦合度低。

3.7找出變化點,封裝變化點

  • 尋找出變與不變的分割點,對二者封裝,讓設計者對單方面修改時不會影響到另一面。實現層次間的松耦合。

3.8面向接口編程,而不是面向對象編程

  • 不將變量類型聲明為某個特定的具體類,而是聲明為某個接口。
  • 客戶程序無需獲知對象的具體類型,只需要知道對象所具有的接口。
  • 減少系統中各部分的依賴關系,從而實現高內聚、松耦合的類型設計方案。

4.面向接口設計

在現實中,面向接口設計隨處可見,比如那麽多的標準協會,比如發布的C++標準,C-98/03/11等,比如各個工廠生產的零件等,都有各自對應的生產標準,只有接口標準化,才會使產業更加強盛。相反,接口沒有標準,就會造成生產力低下,根本無經濟全球化一說了。

面向接口編程就是抽象需求成一個個獨立的接口/抽象類,然後被繼承或委托/組成的形式來實現或拓展新的具體或更加強大完善的抽象,通過層層封裝、繼承,最後就會實現運行時多態的特性,從而提高代碼的靈活性。

6.小結

本文通過分析什麽是面向對象,為什麽需要面向對象,和面向對象設計的原則來說明軟件開發中面向對象設計是實現大型軟件程序的基石。面向接口編程,而不是面向對象編程,能夠使代碼更加靈活,更加優美強大。

設計模式——面向對象設計原則