设计模式简要笔记
設計模式的視頻課程今天算是告一段落,視頻+《大話設計模式》+ GoF的粗淺學習,還需要日后的練習應用。學習期間留下一段雜亂摘要筆記,供自己溫故知新和增刪整改。
=====================================================================================
0. 單項溝通:A為B服務,則A需要知道B能干什么,但B不需要知道A;不要跨越層次調用功能
0. 語言以外的接口,指的是類的對外的行為,比如公開方法屬性事件索引器
0. 工廠:將復雜的創建與表現(使用)分離,客戶端類不知道他所必須創建的對象的具體類的時候,只創建父類對象,具體多態成哪種具體類,交給工廠
------------------------ 創建型 ----------------------------------
0. 工廠方法:產品父類,產品子類;工廠父類,工廠子類。增加新產品就需要增加新的產品子類和新的工廠子類,平行繼承問題,無法解決。
1. 【唯一】:單例模式:唯一,全局訪問點
1)餓漢:靜態先創建;懶漢:調用再創建
2)多線程訪問:加線程鎖Lock,兩層判斷null,第一層為性能,第二層為判斷
3)單例和靜態類在內存中都只有一個對象,單例對象可釋放,靜態只能等程序結束才可釋放
2. 【多選一】簡單工廠:。多個類型選擇一個來創建,將創建對象的職責委托給一個全局創建點
1)創建多個實例,可能用到switch的情況,提取出來放到工廠類。一類產品的創建交給一個工廠來做。
2)不用switch,依賴注入(構造子注入、設值注入、配置注入),所依賴的東西由外界(客戶端)傳進來。如應該創建“什么類型”的實例,類型用反射來提供。
3)工廠生成的是產品,創建者生成的是部件。
3. 【系列】:抽象工廠:多選多。
1)抽象工廠創建產品1產品2,子工廠按照系列化來生產特定系列的產品1產品2
2)抽象工廠不派生,工廠中增加系列字段,利用反射來創建產品1產品2
3)工廠生成的是產品,創建者生成的是部件。
4. 【克隆】:原型模式:克隆對象,.Net可直接實現ICloneable接口,其他平臺需手寫IClone<>接口
0)適用性:當一個系統應該獨立于他的產品創建、構成、表示時,要使用原型模式
1)當要實例化的類是在運行時刻指定,比如動態裝載,或者
2)為了避免創建一個與產品類層次平行的工廠類層次時,或者
3)當一個類的實例只能有幾個不同狀態(成員賦值)組合中的一種時。建立相應數目的原型并克隆。
4)淺拷貝、深拷貝
5)需要深拷貝的引用型成員,其類型也應該實現ICloneable接口
5. 【組裝】:創建者(生成器)模式:創建復雜對象(成員也有類等),結構穩定,組成結構的具體對象是變化的
0)例如:同樣是車構造,不同品牌部件不同;同樣是8件套裝,T1和T2
1)同樣的構建過程可以創建不同的表示
2)創建、構建(組裝)、表示(客戶)分開;構建過程是穩定的,有新增套裝則新增生成器
3)工廠生成的是獨立的產品,創建者生成的是套裝的部件。
------------------------ 結構型 ----------------------------------
6. 【轉接】適配器模式:對象復用,新舊兼容
1)功能一致的兩個類,接口不同,不可直接復用,增加適配器類進行接口包裝轉換,使可以兼容
2)預先合理設計、發現問題及時重構,可以避免使用適配器
3)類適配器通過多重繼承實現,.Net java等不支持
4)對象適配器
5)例子:Resources.Load類,傳參和返回與需求不符,增加ResourcesManager類,對其進行包裝
6)例子:技能外觀類中,無參施放方法包裝了有參施放方法,并復用了skillManager
7. 【向導】外觀模式:組織系統,簡化調用
0)對內高內聚,對外低耦合
1)為子系統中的一組接口提供一個一致的界面,定義了一個高層接口,這個接口讓子系統更易用
2)外觀模式可有可無;簡化客戶調用;解耦客戶端與實現子類間的依賴性;層次結構(比如MVC)中定義每一層子系統入口,子系統之間相互依賴則可讓子系統通過外觀通信
3)個人炒多支股票是一組子系統,購買基金間接買賣股票是外觀
4)例子:技能外觀類中,AttackUseSkill
8. 【連接】橋接模式:依賴抽象,連接兩端的變化
1) 將抽象部分與實現部分分離,使他們可以獨立變化;解決排列組合的情況
2) 例子:技能施放器,選擇目標的算法() 與 施放技能的模式() 都可能變化
9. 【包裝】裝飾模式:動態為對象(而不是類)增加額外功能,接口要一致;將主要方法以串聯方式逐一增加給主目標(一層層裝飾)
1)不更換引用,不更換接口:所以具體組件類和裝飾器類都要繼承同一個組件父類,同事裝飾器要聚合父類;具體裝飾器要保留父類功能,再新增自己的功能
2)如果沒有共同的組件父類,可讓具體組件類作為裝飾器類的父類
3)裝飾器聚合父類,可用構造方法傳入,可用Set傳入
4)在裝飾器類中加入拆包裝功能:一層層包裝,一層層拆包裝
5)給對象加功能,不考慮統一的接口,可以使用委托回調
6)行為疊加就疊加方法,數據疊加就疊加值
7)例子:StreamReader(new FileStream),用StreamReader包裝一個FileStream對象
8)例子:不影響行為,影響數值的裝飾:角色 + 裝備
9)適用性
1>不影響其他對象的情況下,動態、透明地給單個對象添加職責
2>處理可以撤銷的職責
3>不能采用派生的方法來擴充時
10. 【樹】組合模式:樹形層次關系
1)樹枝無限層次實現,自己包含自己:List<ThisClass> list;樹葉不包含自己。
2)不讓客戶為難,所以樹葉和樹枝都繼承于根
3)簡化版,現有層次,再判斷枝葉;無分支則認為是Leaf,TreeNode類,List<TreeNode> list, IsLeaf{get{return nodes.Count == 0;}}
4)例子:電商的商品類別,無限層次,增加父類別編號屬性
5)例子:固定類別層次
11. 【幌子】代理模式
1)對一個對象進行訪問控制
2)適用性
1>遠程代理:本地創建代理訪問遠程
2>虛代理:根據需要創建開銷很大的對象的代理(縮略圖、壓縮)
3>保護代理:控制對原始對象的訪問,對象擁有不同的訪問權限
4>智能指引:取代了簡單的指針,訪問對象時執行一些附加操作
1)對指向實際對象的引用計數,該對象無引用時可以自動釋放 (GC)
2)第一次訪問一個持久化對象,將其放入內存(緩存)
3)訪問一個實際對象前,確定其是否已被鎖定,確保其他對象不可修改他(lock)
2. 例子:立即可查看的小圖片,代理真正的大圖
12. 享元模式
------------------------ 行為型 ----------------------------------
13. 【通知,自動更新】觀察者模式:一對多交互,依賴倒置,抽象通知者,抽象觀察者。
1)事件為發布者,事件注冊即為添加觀察者
2)例子:事件,一對多的通知,一方通知,多方訂閱;通知者不知道都誰訂閱,訂閱者互相不認識,訂閱后行為不盡相同。
3)Attach、Detach,用List放觀察者;注冊、減注冊,用event注冊觀察者
14. 【交流平臺】中介者模式:多對多交互,中介調停者
1)例子:聯合國抽象中介者,聯合國安理會具體中介者,國家抽象參與者,中美具體參與者
15. 【切換算法】策略模式:關注算法切換的問題,無前置條件,就是改變
1)算法獨立封裝,可相互替換,獨立于客戶;客戶依賴于抽象策略接口
2)例子:不同崗位算工資,封裝不同算法
3)例子:攻擊選擇器,封裝選擇算法
16. 【狀態決定行為】狀態模式:對象狀態變化時改變他的行為,有條件地改變,如升級了就跑著走
1)模式結構與策略模式相同,引入委托/事件 回調
17. 【骨架】模板方法:定義一個操作中的算法骨架,將特定步驟延遲到子類。
1)就是模板,在父類中最大化提煉代碼,派生類只寫不同的地方
2)模板方法用抽象方法或虛方法
3)骨架、調用邏輯為模板,具體實現和細節交給派生類
18. 備忘錄:記錄一個對象的臨時狀態,游戲存檔
19. 迭代器:提供一種方法順序訪問一個聚合對象中的各個元素,而又不暴露該對象的內部表示
1)結構:First(), Next(), IsDone(), CurrentItem()
2)例子:Foreach、yield return、IEnumerator
20. 職責鏈
21. 命令模式
22. 解釋器
23. 訪問者
?
轉載于:https://www.cnblogs.com/gameobject/p/7811683.html
總結
- 上一篇: 手动添加Cookie
- 下一篇: “况乘大夫轩”上一句是什么