紮實基礎_設計模式之六大原則,及其模式總結

一:單一職責:類的內部定義

  定       義:一個類只負責一項職責,不要存在多餘一個導致類變更的因素

  反面例子:A類游泳池,負責游泳功能和跳水功能,當某一天,游泳功能改為跑步, 那麼A類勢必要進行改造,從而影響跳水功能

  解決方案:遵循單一職責,游泳就為游泳類,跳水就為跳水類

二:開閉原則

  定       義:類,函數,模組,開放拓展功能,關閉,修改功能   因為修改的時候,你不知道有哪幾個地方調用它

  反面例子:軟體,一個類,函數,基本都是二次開發,迭代,很少是一手程式碼,對應一手程式設計師,所以修改會引起很大危險

  解決方案:軟體需要變化的時候,盡量拓展來滿足需求,而不是直接去修改它,拓展之後的業務邏輯都是自己的,改起來so easily

三:里氏替換法則:類與類之間的關係

  定       義:子類可以擴展父類的功能,但不能改變父類原有的功能

  反面例子:繼承帶來好處,但是也帶來了弊端,當一個類被其他類繼承到時候,修改這個類,必須要考慮到所有的子類功能是否會產生問題

  解決方案:

  •   子類可以實現父類的抽象方法,但不能覆蓋父類的非抽象方法。
  • 子類中可以增加自己特有的方法。
  • 當子類的方法重載父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入參數更寬鬆。
  • 當子類的方法實現父類的抽象方法時,方法的後置條件(即方法的返回值)要比父類更嚴格。

四:依賴倒置

  定義; 核心思想就是面向介面編程,高層模組不應該依賴低層模組,二者都應該依賴其抽象;抽象不應該依賴細節;細節應該依賴抽象。

  反面例子:員工依賴公司, 如果員工想離開,變成老闆, 則必須要和公司接觸依賴, 

  解決方案:都依賴一個介面平台, 只要符合介面平台原則,想變老闆就老闆

五:介面隔離原則

  定義:客戶端不應該依賴它不需要的介面;一個類對另一個類的依賴應該建立在最小的介面上。

  反面例子:類A通過介面I依賴類B,類C通過介面I依賴類D,如果介面I對於類A和類B來說不是最小介面,則類B和類D必須去實現他們不需要的方法。

  解決方案:將臃腫的介面I拆分為獨立的幾個介面 按功能劃分,類A和類C分別與他們需要的介面建立依賴關係。也就是採用介面隔離原則。

六:迪米特法則: 類與類之間的聯繫

  定義:一個對象應該對其他對象保持最少的了解。

  反面例子:類與類之間的關係越密切,耦合度越大,當一個類發生改變時,對另一個類的影響也越大。

  解決方案:盡量降低類與其他類之間的耦合。 只和自己直接的類聯繫

 

創建型模式總結:

      關注對象的創建,把對象的創建進行轉移,複製,克隆   ,             

      目的就是降低對象與對象直接的耦合

結構型模式總結:

      關注類與類之間的關係,繼承,組合,依賴,  並且組合優於繼承   

      目的就是降低類與類直接的耦合    

行為型模式總結:關注對象和行為的分離                                                           

      目的就是降低對象和行為直接的耦合

 

簡單工廠_創建型模式

  對        象:用戶 工廠 產品

  使用條件: 複雜的對象創建 用戶不自己創建對象,而是由工廠來創建

  例       子:  用戶class去工廠class買鞋class,  鞋clss是由工廠實例化的   而不是你用戶來生產的,你只需要找到工廠 說明你要買的那種鞋,工廠就是給你需要的鞋

工廠方法_創建型模式  

  對        象:用戶 工廠 抽象工廠  產品

  使用條件:比簡單工廠複雜的對象創建 用戶不自己創建對象,而是由抽象工廠裡面的具體工廠來創建

  例       子:  用戶去小米買鍵盤產品,  鍵盤產品是繼承與,抽象小米產品的, 抽象小米產品下面 有很多小米手機,紅米手機, 

單例模式_創建型模式

  對        象: 全局唯一類

  使用條件:多個對象,其需要實例化一個對象,全局只允許存在一個實例class 

  例       子:資料庫連接,

原型模式_創建型模式

  對       象:全局唯一類 

  使用條件:有重複對象,或相同對象,不同屬性

  例       子:qqvip,,qqvip每個有都有這個對象,但是每個qq vip等級不同,就會展示不同東西,

       圍棋棋子對象,都是用的棋子對象,只是顏色位置不一樣

建造者模式_創建型模式

  對       象:指揮者 具體建造者(工人) 抽象建造者(工人)  產品

  使用條件:比工廠方法更加複雜的對象創建。流程固定,

  例       子: 建一棟房子, 有水泥工, 砌牆工,鋼筋工, 他們的建造流程都由指揮者控制,先造地基,再建框架,流程不能亂  工人配好水泥鋼筋產品     

適配器模式_創建型模式

  對       象:  oracle類 抽象資料庫類   適配器   第三方產品

  使用條件: 第三方產品無法更改的情況下, 我們系統需要用, 可以用適配器轉接

  例       子:  本國人  抽象人, 翻譯, 外國人 ,外國人不會說漢語,如果會說漢語就不需要翻譯了,拿也就不需要適配器模式了

 

橋接模式_結構型

   class: 蘋果手機類,抽象手機類 ,系統類,抽象系統類  

  使用條件:  解決多維度的變化,多重繼承與變化封裝

  例       子:  蘋果,華為,手機,都有自己的系統, 但是也可以刷機成,ios和andor系統, 如果手機和系統耦合太高,那麼每一個系統和型號的改變,蘋果手機類就要發生改變

組合模式_結構型:

  class:  

  使用條件: 適用於 樹形結構,遞歸自己

  例       子:   我們的C盤裡面就是一個樹形結構,你不知道裡面有多少個文件夾,但是現在要找出來c盤下面A文件裡面的文件數量 就可以用遞歸實現 你只需要知道C://A文件盤位置

      組合模式分為安全和透明模式  有父類和子類

      安全:就是子類自己有遞歸方法

      透明:就是父類自己有遞歸方法,這就造成了,子類繼承父類的時候必須繼承它的遞歸方法,會報錯,需要忽略這個錯誤

 

裝飾器模式_結構型:面向切面編程 (AOP) 動態的添加功能

  class:   類與類直接的關係 降低耦合

  使用條件: OOP設計的流程已經滿足不了系統需求,需要用AOP來實現

  例       子:   動態的添加功能 動態的給對象添加 層級功能  每一層都是單獨的 可變順序的,就像人穿衣服一樣,每一件衣服都是獨立的,材質,品質不同,也可以先穿外套,再穿內衣

 

外觀模式_結構型:

  class:     UI  BLL DAL

  使用條件: 比較簡單,就是多一層介面,降低UI與DAL層的直接交互

  例       子:   經典的三層架構, 就是避免了ui層直接訪問DAL數據層, 從而有了BLL業務邏輯層

       舊有的系統與新系統之間的聯繫,可以使用外觀模式, 都訪問中間facade 來避免舊有系統持續擴大,和業務邏輯的管理 減少類之間的依賴

 

享元模式_結構型:

  class:      類, 抽象類   抽象類中有公用的屬性    類裡面有自己私有的屬性

  使用條件: 把對象相同的屬性歸於一個類,其他不同屬性通過外部類傳遞進來, 減少對象的重複創建   

  例       子:  就像鬥地主一樣,56張牌  new56個對象,三個人就佔了56個記憶體地址, 那麼一個棋牌平台估計經不起這麼折騰,

         他們區別就是裡面的數字 花色不同,把這個提出來, new一個撲克對象, 裡面包含一個類   而這個類的屬性欄位有:數字花色

代理模式_行為型: 

  class:        類  代理類    實現類

  使用條件:  類不直接與實現類關聯,而是創建一個代理來執行

  例       子:   火車站售票處,彩票窗口, 不可能自己直接去火車上買吧, 當然也有這種情況,那麼就會出現堵塞,許可權也控制不了,還沒有秩序  

      快取代理:封裝一個第三方快取, 在代理裡面進行快取操作 提升性能 性能提升 優先考慮快取
      單例代理: 代理類裡面做好單例
      異常代理:  代理類裡面做好異常控制
      延遲代理:隊列 前端延遲載入 一切可以推遲的東西晚點再做 按需載入 類初始化的時候為空,在方法執行的時候再去實例化
      許可權代理:鑒權-授權-認證 CallContxt 一個寫 一個查 放在一個共享的地方
      AOP:面向切面核心追求,不破壞封裝的前提下,動態擴展功能

 

模板方法_行為型

  class:          類,抽象類    定義一個抽象父類,實現通用的處理流程 對於不同業務在抽象父類提供抽象方法,由不同子類去實現

  使用條件:   應對在一個長業務固定流程中,環節可擴轉變化就可以使用模板方法,對於部分相同業務在抽象父類提供虛方法,默認為父類方法,子類可重新訂製個性化需求

  例       子:    可變的和不可變的混在一起,把不可變的提取出來,做成公共的   同樣的車,有公共的配置,大家都是四個輪胎,一個方向盤,但是有的人的車,需要車內飾個性化訂製

 

責任鏈_行為型

  class:           請求人, 請求的數據, 審批人

  使用條件:    一條請求,需要流傳到各個對象手裡,但是各個對象審批順序可以變化。

        可以把請求結構包裝存到一個第三方contenxt 也是責任鏈模式的標緻, 審批過程中的節點動態擴展及更改

  例       子:    請假審批,給主管 經理 ceo

 

命令模式_行為型

  class:         請求者 抽象命令 具體命令, 執行者

  使用條件:    需要發送一個請求,並且這個請求有相關命令,且數據很重要,需要實時備份 調用者將請求封裝,>請求封裝成命令對象,>最後發送給執行者, 

         命令>執行者 中間就可以做成非同步隊列服務,保存好命令集,哪怕資料庫崩了,也可以執行命令集來恢復

  例       子:  各種app付款指令>到資料庫。如果每天凌晨0點備份  萬一早上九點資料庫損壞, 那麼0點-9點的這段時間 就可以用命令來執行恢復

 

迭代器_行為型

  class:           

  使用條件:   需要循環的數據集合 list,數組,提供統一訪問方式 如果不用foreach  迭代他們是需要不同的訪問方式的

  例       子:  foreach 就是c# 完美實現了迭代器模式

 

中介者_行為型

  class:           發送類  中介類  接收類    (用戶  角色 許可權)

  使用條件:  點到點需要變成點到面,

  例       子:  群發消息下班,如果人事說要下班,沒有中介者,那麼需要一個個找到並通知,現在只需要通過郵件這個中介發送給大家  

       常見的就是我們系統程式的 用戶 角色 和UI   管理者和普通用戶展現的頁面菜單不一樣   用戶擁有管理者角色  可以訪問後台菜單 但是後台菜單可以給多個角色

 

備忘錄_行為型

  class:           發起人 備忘錄(第三方容器),管理者(負責發起人的存檔和載入行為)

  使用條件:  保存某種進度,備份行為

  例       子:  遊戲保存進度

 

觀察者_行為型

  class:           觀察者 抽象觀察者  主題 具體主題

  使用條件:    一對多的的依賴關係 讓多個觀察者對象同時監聽一個主題對象 一個對象改變時 而其他對象不知道有多少並且也需要跟著改變

  例       子:   委託是最好的解決方案  ,

 

狀態_行為型

  class:           context   state  具體state

  使用條件:   不同狀態,執行不同行為,消除龐大的分支判斷條件

  例       子:  地鐵閘門。投票行為, 避免惡意刷票

 

策略_行為型

  class:           contenxt   抽象演算法策略類 具體演算法策略類

  使用條件:    各種運用到演算法的地方

  例       子:  計算器,商場打折,營銷活動

 

訪問者_行為型

  class:        抽象學生  普通學生 VIp學生   訪問者    學生的具體行為   

  使用條件:   固定場景, 學生這個類型是固定的不能變化,因為這個是最底層,

  例       子:  消息任務處理,來了一個消息 處理方式 有 插入資料庫,插入文本,插入遠程伺服器,

         首先一進來要判斷學生類型, 然後每個學生類型有一個吃飯行為, 這個吃飯行為又有不同的狀態需要判斷 多分支判斷下面有多分支判斷