【設計模式】設計原則與設計模式

前言

一切設計都爲了代碼的可擴展性和可讀性,都爲了應對變化!

我們是基於設計原則的思想,來選擇設計模式去實現,代碼可讀,可擴展的目標!

1 設計原則


1.1 開閉原則(Open-Closed Principle, OCP)

核心設計思想:對擴展開放,對修改關閉。

含義:抽象可變功能,可變功能通過子類擴展實現,避免對已有抽象實現的修改。

優點:便於擴展;

1.2 單一職責(Simple Responsibility Pinciple,SRP)

核心設計思想:單個方法或單個類或單個包,應該包含單一的職責

含義:

  • 一個方法應該只負責一個功能,如果方法的功能包含很多,代碼很臃腫,請將方法進行拆分,主方法負責核心流程,分方法負責具體單個功能點的實現;
  • 一個Class類應該只負責一個明確的職責,不要想一個Class把所有事情都做了,比如一個服務層的類,不要把數據層的功能都寫在一起
  • 一個包應該只負責一個方面的職責,比如dao包下面就是負責數據層服務的

優點:便於擴展;可讀性高

1.3 依賴倒置原則(Dependence Inversion Principle,DIP)

設計思想:高層模塊不應該依賴底層模塊,應該依賴其抽象

含義:面向接口編程,不要面向實現,比如服務模塊代碼會使用數據模塊的功能,那麼服務模塊應該內聚的是數據模塊的抽象,而不是具體的數據模塊實現,這樣可以避免因數據模塊實現的變動,而導致服務模塊的改變。經典應用:Spring的IOC

優點:便於擴展;

1.4 接口隔離原則(Interface Segregation Principle, ISP)

設計思想:接口設計應該具備單一責任要求,即多個單一責任接口替換多責任接口

含義:子類避免繼承接口後,被迫實現一些自己不需要的功能,哪怕是空實現,也代表接口設計出現責任非單一的問題。應該把接口細化,按功能劃分爲多類接口。

優點:便於擴展;可讀性高

1.5 迪米特原則(Law of Demeter LoD)/最少知道原則(LKP)

設計思想:一個對象應該對其他對象保持最少的瞭解

含義:

  • 避免無關的依賴,比如A依賴B實現某個功能,B又需要依賴C,那麼A完全沒必要知道C的存在,那C就不要已中間對象的形式出現在A的功能實現中;
  • 控制方法訪問權限,即public,protect,default,private,如果方法私有那麼一定是private,請按最小原則控制對象的訪問權限,對外部對象,應按需暴露方法和屬性,越少越好;

優點:便於擴展;可讀性高;

1.6 里氏替換原則(Liskov Substitution Principle,LSP)

設計思想:所有引用基類的地方必須能替換爲它的任意子類對象,且程序執行效果“不變 ”

含義:子類不要重寫父類的非抽象方法,父類只實現通用方法即可。儘量保證繼承的有意義,不要亂用繼承,來實現非繼承功能。其實就是少修改,多擴展,也是開閉原則的體現。

優點:可擴展性;可讀性高;

1.7 合成複用原則(Composite/Aggregate Reuse Principle,CARP)

設計思想:儘量使用對象組合(has-a)/聚合(contanis-a),而不是繼承關係達到功能複用的目的

含義:里氏替換是強調合理使用繼承,如果出現繼承無法滿足的時候,採用合成複用的方式,而不要去破壞原本的繼承關係。

優點:可擴展性;可讀性高;

總體來說,都是爲了可擴展性和可讀性,

核心思想:開閉和單一;

實現方式:依賴倒置、接口隔離、最少知道;

關係約定:里氏替換、合成複用;

2 設計模式:設計原則的體現


2.1 單例模式

  • 單一責任:單例麼,只負責生產一個產品,有且只有一個功能

2.2 工廠方法|抽象工廠:

  • 開閉原則:工廠定義構建產品的超類的通用方法不變,子類工廠擴展實現構建不同子類產品的方法
  • 單一責任:每個子類工廠只負責一個類型的產品生產
  • 依賴倒置:工廠依賴的是產品的抽象,而不是產品的實現

2.3 建造者模式

  • 開閉原則:構建方式不變,但可以擴展實現構建的子項
  • 依賴倒置:建造者依賴的是子項的抽象
  • 合成複用:建造者通過組合子項的方式來擴展功能

2.4 原型模式

  • 單一責任:原型實現克隆接口,僅負責克隆一件事情

2.5 適配器模式

  • 開閉原則:提供功能的對象(A)不變,適配目標(B)不變,擴展實現一個適配器(C)使用A來實現目標B的功能
  • 單一責任:提供功能的對象,適配目標對象,適配器對象,各自職責唯一
  • 合成複用:適配器組合了提供功能的對象

2.6 橋樑模式

  • 開閉原則:當部分功能實現有自己的一套擴展機制,爲了保證抽象的不變性,讓實現化的部分獨立擴展
  • 單一責任:抽象化與實現化的分離,使得兩者責任單一,可以自由發展
  • 合成複用:抽象化對象聚合實現化對象,從而獲得實現化對象的功能
  • 接口隔離:這個體現的太明顯了
  • 依賴倒置:抽象化對象的抽象依賴實現化對象的超類

2.7 樹組模式

  • 開閉原則:樹組結構不變,通過繼承體系自由擴展
  • 合成複用:對象本身聚合對象的集合,構成父子節點關係

2.8 裝飾者模式

  • 開閉原則:裝飾結構不變,面向變化擴展的經典實現
  • 合成複用:對象本身通過聚合同類對象,實現了功能的擴展
  • 單一責任:每一個裝飾者僅負責自己獨立的功能

2.9 門面模式

  • 開閉原則:門面本身對外接口不變,內部通過擴展來應對變化
  • 合成複用:門面聚合各類子功能的實現對象
  • 單一責任:門面幹門面的活,子功能幹子功能的事

2.10 享元模式

  • 合成複用:享元對象聚合共享對象的集合
  • 單一責任:享元對象僅提供訪問共享對象的入口,各種功能實現由共享對象完成

2.11 代理模式

  • 合成複用:代理對象聚合被代理的對象,從而可以控制被代理對象的功能執行過程
  • 單一責任:代理僅負責控制執行過程,不做功能上的附加操作

2.12 責任鏈模式

  • 開閉原則:鏈表的結構不變,但可以自由的擴展不同的實現
  • 單一責任:每個責任鏈的節點只負責單一的功能
  • 合成複用:每個責任鏈的節點會聚合下一個責任鏈的節點

2.13 命令模式

  • 單一責任:命令、調用者、執行者,各自負責自己的功能
  • 合成複用:命令對象聚合執行者對象,調用者對象聚合命令對象
  • 最少知道:調用者與執行者解耦,因爲通常調用者無需知道執行者的所有行爲,他只需知道當前執行的命令相關信息即可

2.14 解釋器模式

  • 單一責任:就幹翻譯這一件事,對於被翻譯對象而言,他沒必要再提供翻譯相關的實現,將這個實現交給翻譯器即可

2.15 迭代器模式

  • 單一責任:就負責迭代訪問數據
  • 開閉原則:迭代方式通用不變,各個集合實現各自的迭代需求
  • 合成複用:每個迭代器默認聚合各自的集合類,通過集合類本身方法實現迭代功能,也是一種適配模式
  • 接口隔離:相對於統一的集合接口,他把迭代實現分離

2.16 中介者模式

  • 單一責任:嘿嘿,中介就是個負責對象間關係的
  • 開閉原則:中介處理關係不變,中介負責的對象,可以自由擴展
  • 合成複用:中介聚合相關的對象

2.17 備忘錄模式

  • 單一責任:爲對象信息持久化提供功能,僅此一個功能哦

2.18 觀察者模式

  • 合成複用:觀察者聚合被觀察主題(主動獲取主題變化);被觀察主題聚合被觀察者集合(主題主動通知觀察者)
  • 依賴倒置:兩者之間皆是聚合抽象

2.19 狀態模式

  • 合成複用:對象聚合狀態抽象,來實現不同狀態下的行爲
  • 依賴倒置:對象聚合狀態的抽象,而非實現

2.20 策略模式

  • 合成複用:對象聚合策略抽象,來實現不同策略下的行爲
  • 依賴倒置:對象聚合策略的抽象,而非實現

2.21 模板方法模式

  • 開閉原則:模板抽象通用方法不變,差異化部分,由子類擴展實現
  • 里氏替換:父類只實現通用方法,很明顯的原則體現

2.22 訪問者模式

  • 責任單一:訪問者就是負責臨時“訪問”功能,被用於其他對象方法參數依賴

 

3 總結


心懷擴展,代碼易讀,原則爲本,模式爲法。

多讀源碼!多思考!多動手!gogogo!

 

 

 


愛家人,愛生活,愛設計,愛編程,擁抱精彩人生!

 

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