天天看點

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

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

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

  反面例子: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學生   通路者    學生的具體行為   

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

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

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