紮實基礎_設計模式之六大原則,及其模式總結
- 2020 年 5 月 21 日
- 筆記
- C#基礎, c#設計模式, c#高級程式設計師要學的知識, 程式設計師必備知識, 設計模式, 高級.net工程師之路
一:單一職責:類的內部定義
定 義:一個類只負責一項職責,不要存在多餘一個導致類變更的因素
反面例子: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學生 訪問者 學生的具體行為
使用條件: 固定場景, 學生這個類型是固定的不能變化,因為這個是最底層,
例 子: 消息任務處理,來了一個消息 處理方式 有 插入資料庫,插入文本,插入遠程伺服器,
首先一進來要判斷學生類型, 然後每個學生類型有一個吃飯行為, 這個吃飯行為又有不同的狀態需要判斷 多分支判斷下面有多分支判斷