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