一:單一職責:類的内部定義
定 義:一個類隻負責一項職責,不要存在多餘一個導緻類變更的因素
反面例子: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學生 通路者 學生的具體行為
使用條件: 固定場景, 學生這個類型是固定的不能變化,因為這個是最底層,
例 子: 消息任務處理,來了一個消息 處理方式 有 插入資料庫,插入文本,插入遠端伺服器,
首先一進來要判斷學生類型, 然後每個學生類型有一個吃飯行為, 這個吃飯行為又有不同的狀态需要判斷 多分支判斷下面有多分支判斷