讀書筆記 |《大話設(shè)計(jì)模式》之設(shè)計(jì)模式趣談

PART1擅耽、 前言


TOPIC: 23種設(shè)計(jì)模式的趣談

收獲

  • 初步理解各種設(shè)計(jì)模式
  • 通過設(shè)計(jì)模式理解
    • 封裝變化菲宴、多態(tài)
    • 對(duì)象間松散耦合
    • 針對(duì)接口編程
  • 設(shè)計(jì)出易維護(hù)、擴(kuò)展滓侍、服用、靈活性好的pro

設(shè)計(jì)模式四境界

1牲芋、不會(huì)用設(shè)計(jì)模式撩笆,代碼很爛
2、學(xué)了幾個(gè)模式缸浦,胡亂套用而不自知
3夕冲、感覺很多模式很相似,不知差異處
4裂逐、靈活運(yùn)用歹鱼,無(wú)劍勝有劍

PART2、創(chuàng)建型設(shè)計(jì)模式


簡(jiǎn)單工廠模式

  • 解決實(shí)例化哪個(gè)對(duì)象的問題
  • 工廠類的方法一般用靜態(tài)方法卜高,理論上可以不用靜態(tài)
  • 工廠類用途:創(chuàng)建產(chǎn)品類的實(shí)例
  • UML圖


    Paste_Image.png
  • 例子:計(jì)算器

工廠模式

  • UML圖
  • 比簡(jiǎn)單工廠好在哪弥姻?
    • 簡(jiǎn)單工廠違背了開放-封閉原則
    • 簡(jiǎn)單工廠每次添加功能,都要修改工廠類

原型模式

  • UML圖
  • 在內(nèi)存中克隆對(duì)象

    • 減少執(zhí)行new(構(gòu)造函數(shù))的次數(shù)掺涛,提高執(zhí)行效率
  • 使用:繼承IClonable接口,調(diào)用clone方法

    • 缺點(diǎn):MemberWiseClone方法僅是淺復(fù)制

      •   該方法作用與默認(rèn)拷貝構(gòu)造函數(shù)相同
        
    • 實(shí)現(xiàn)深復(fù)制的方法

      •   1庭敦、構(gòu)造函數(shù)中調(diào)用clone
        
      •   2、clone中new對(duì)象
        
      •   作用于拷貝構(gòu)造函數(shù)相同
        
  • 例子:簡(jiǎn)歷復(fù)印

建造者模式

  • uml圖

  • 例子:建造小人-頭-身-手-腿
  • 例子:快餐流水線模式
  • 將復(fù)雜對(duì)象的構(gòu)建與他的表示分離薪缆,使同樣的構(gòu)建過程可創(chuàng)建不同的表示

抽象工廠模式

  • UML


  • 實(shí)質(zhì)是提供接口秧廉,創(chuàng)建一系列相關(guān)或獨(dú)立的對(duì)象,而不指定這些對(duì)象的具體類矮燎。
  • 與工廠模式的區(qū)別
      • 多個(gè)抽象產(chǎn)品類定血,每個(gè)抽象產(chǎn)品類可以派生出多個(gè)具體產(chǎn)品類
      • 一個(gè)抽象工廠類,可以派生出多個(gè)具體工廠類
      • 每個(gè)具體工廠類可以創(chuàng)建多個(gè)具體產(chǎn)品類的實(shí)例
      • 一個(gè)抽象產(chǎn)品類诞外,可以派生出多個(gè)具體產(chǎn)品類
      • 一個(gè)抽象工廠類澜沟,可以派生出多個(gè)具體工廠類
      • 每個(gè)具體工廠類只能創(chuàng)建一個(gè)具體產(chǎn)品類的實(shí)例
  • 聯(lián)系MVC架構(gòu),多種類型數(shù)據(jù)庫(kù)實(shí)現(xiàn)形式

單例模式

  • uml及代碼結(jié)構(gòu)
  • 定義
    • 保證一個(gè)類僅有一個(gè)實(shí)例
    • 提供一個(gè)訪問他的全局訪問點(diǎn)

PART3峡谊、行為型設(shè)計(jì)模式


策略模式

  • 定義了算法家族茫虽,分別封裝刊苍,各算法的替換不影響用戶的操作

  • ps:c#繼承父類的默認(rèn)訪問級(jí)別是:internal

  • 簡(jiǎn)單工廠和策略模式的差別

    • 簡(jiǎn)單工廠:
      • instance = new Class(); Class.doSth();
      • 傳遞相應(yīng)條件得到想要的對(duì)象,然后通過該對(duì)象實(shí)現(xiàn)算法的操作
    • 策略模式:
      • instance.doSomething();
      • 創(chuàng)建一個(gè)想要的對(duì)象濒析,將該對(duì)象作為參數(shù)傳遞進(jìn)策略類正什,通過該對(duì)象調(diào)用不同的算法
  • UML圖

  • 例子:商場(chǎng)收銀系統(tǒng)

模板方法模式

  • 將不變的行為放在父類,去除子類中重復(fù)的代碼
  • 例子:.net中的母版模式
  • 實(shí)現(xiàn)代碼復(fù)用

觀察者模式

  • JAVA中的設(shè)置監(jiān)聽器Listener和C#中的時(shí)間響應(yīng)機(jī)制都運(yùn)用了該模式
  • uml圖
  • 概念
    • 定義一對(duì)多的依賴關(guān)系号杏,讓多個(gè)觀察者同時(shí)監(jiān)聽某一主題對(duì)象
    • 主題對(duì)象狀態(tài)發(fā)生變化婴氮,會(huì)通知所有觀察者對(duì)象,使他們能自動(dòng)更新自己
  • 應(yīng)用場(chǎng)合:當(dāng)一個(gè)對(duì)象的改變需要同時(shí)改變其他對(duì)象的時(shí)候

狀態(tài)模式

  • 定義:允許一個(gè)對(duì)象在其內(nèi)部狀態(tài)改變時(shí)改變它的行為盾致。對(duì)象看起來似乎修改了它的類
  • 應(yīng)用場(chǎng)景
    • 1主经、一個(gè)對(duì)象的行為取決于它的狀態(tài)
    • 2、代碼中包含大量與對(duì)象狀態(tài)有關(guān)的條件語(yǔ)句
  • UML圖
  • 目的:消除龐雜的條件語(yǔ)句

備忘錄模式

  • 定義
    在不破壞封閉的前提下庭惜,捕獲一個(gè)對(duì)象的內(nèi)部狀態(tài)罩驻,并在該對(duì)象之外保存這個(gè)狀態(tài)
  • uml


  • 缺點(diǎn):狀態(tài)數(shù)據(jù)過多的話,備忘錄對(duì)象會(huì)很耗內(nèi)存

迭代器模式

  • 定義:順序訪問聚合對(duì)象中各個(gè)元素护赊,且不暴露內(nèi)部表示
  • 該模式已經(jīng)內(nèi)嵌于許多編程語(yǔ)言中了
  • uml

命令模式

  • uml
  • 定義
  • 將請(qǐng)求封裝為對(duì)象惠遏,將發(fā)出命令與執(zhí)行命令的責(zé)任分隔開
  • 實(shí)現(xiàn)行為請(qǐng)求者和行為實(shí)現(xiàn)者的松耦合

職責(zé)鏈模式

  • 定義
    • 包含了一些命令對(duì)象和一系列的處理對(duì)象
    • 處理對(duì)象形成一條鏈條
    • 每一個(gè)處理對(duì)象決定它能處理哪些命令對(duì)象,不能處理的命令對(duì)象傳遞給該鏈中的下一個(gè)處理對(duì)象
  • uml圖
  • 職責(zé)鏈的設(shè)計(jì)動(dòng)機(jī):職責(zé)鏈將請(qǐng)求的發(fā)送者和請(qǐng)求的處理者解耦

中介者模式

  • 定義
    • 用一個(gè)中介對(duì)象來封裝一系列的對(duì)象交互
    • 通過中介對(duì)象來封裝對(duì)象之間的關(guān)系骏啰,使各個(gè)對(duì)象在不知道其他對(duì)象的具體信息情況下通過中介者對(duì)象來與之通信
    • 結(jié)構(gòu)圖:類似星型拓?fù)浣Y(jié)構(gòu)
  • uml圖
  • 缺點(diǎn)
    • 需要知道所有的具體同事類节吮,封裝具體同事類之間相互關(guān)系
    • 中介者對(duì)象變得非常復(fù)雜,系統(tǒng)維護(hù)起來較為困難

解釋器模式

http://blog.csdn.net/chenssy/article/details/12719973

訪問者模式

http://blog.csdn.net/chenssy/article/details/12029633

PART4器一、結(jié)構(gòu)型設(shè)計(jì)模式


裝飾模式

  • 動(dòng)態(tài)給對(duì)象添加額外職責(zé)
  • 對(duì)已有功能動(dòng)態(tài)添加更多功能的一種方式
  • 好處:區(qū)分類的核心職責(zé)和裝飾功能
  • UML圖
  • 例子:穿衣

代理模式

  • 類似回調(diào)函數(shù)
  • 為外部對(duì)象提供代理以控制內(nèi)部對(duì)象的訪問

應(yīng)用場(chǎng)景:

  • 遠(yuǎn)程代理

    • 隱藏一個(gè)對(duì)象存在于不同地址空間的事實(shí)
    • 例子:webservice
      `
  • 虛擬代理

    • 瀏覽器瀏覽網(wǎng)頁(yè)原理
    • 通過使用過一個(gè)小的對(duì)象代理一個(gè)大對(duì)象
    • 就可以減少系統(tǒng)的開銷
  • 安全代理

    • 控制真實(shí)對(duì)象訪問時(shí)的權(quán)限
  • 智能指引

    • 跟智能指針shared_ptr有什么關(guān)系课锌?

UML圖

外觀模式

  • uml圖
  • 例子:炒股&炒基金
  • 例子:三層架構(gòu)中層與層之間使用的就是外觀模式
  • 例子:當(dāng)大型系統(tǒng)代碼臃腫難以維護(hù)時(shí),可用外觀模式重新定義接口祈秕,從而達(dá)到重構(gòu)的目的

適配器模式

  • 定義
    把一個(gè)類的接口變換成客戶端所期待的另一種接口
    Adapter模式使原本因接口不匹配(或者不兼容)而無(wú)法在一起工作的兩個(gè)類能夠在一起工作。
  • UML圖
  • 應(yīng)用場(chǎng)景

    • 兩個(gè)類所做的事情相同或類似雏胃,但有不同接口時(shí)使用
  • 例子:.net中的DataAdapter

    • 用途:用作DataSet和數(shù)據(jù)源之間的適配器请毛,以便檢索和保存數(shù)據(jù)
    • 數(shù)據(jù)源可來自SQL Server或者Oracle、mysql瞭亮,數(shù)據(jù)組織形式上會(huì)有不同
    • DataSet形式:實(shí)質(zhì)是XML數(shù)據(jù)形式

組合模式

  • 定義
    • 將對(duì)象組合成樹形結(jié)構(gòu)以表示“部分整體”的層次結(jié)構(gòu)
    • 使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性
  • uml
  • 應(yīng)用場(chǎng)景
    • 你想表示對(duì)象的部分-整體層次結(jié)構(gòu)
    • 忽略組合對(duì)象與單個(gè)對(duì)象的不同

橋接模式

  • uml圖
  • 定義
    • 將抽象部分與它的實(shí)現(xiàn)部分分離方仿,使它們都可以獨(dú)立地變化
    • 實(shí)現(xiàn)系統(tǒng)可能有多角度分類,每種分類都可能變化
    • 策略:多角度分離出來讓他們獨(dú)立變化统翩,減少耦合
  • wiki
    • 把事物對(duì)象和其具體行為仙蚜、具體特征分離開來,使它們可以各自獨(dú)立的變化
    • 例子
      • “圓形”厂汗、“三角形”歸于抽象的“形狀”之下
      • “畫圓”委粉、“畫三角”歸于實(shí)現(xiàn)行為的“畫圖”類之下,然后由“形狀”調(diào)用“畫圖”娶桦。

享元模式

  • 運(yùn)行共享技術(shù)有效地支持大量細(xì)粒度對(duì)象的復(fù)用
  • 極大的減少系統(tǒng)中對(duì)象的個(gè)數(shù)
  • 享元模式由于使用了外部狀態(tài)贾节,外部狀態(tài)相對(duì)獨(dú)立汁汗,不會(huì)影響到內(nèi)部狀態(tài),所以享元模式使得享元對(duì)象能夠在不同的環(huán)境被共享
  • 缺點(diǎn):需要區(qū)分外部狀態(tài)和內(nèi)部狀態(tài)
  • 應(yīng)用場(chǎng)景:一個(gè)系統(tǒng)中存在大量的相同或者相似的對(duì)象

PART5栗涂、面向?qū)ο笙嚓P(guān)要點(diǎn)知牌、法則


1、UML圖的關(guān)系

  • 接口繼承關(guān)系
  • 關(guān)聯(lián)關(guān)系:類內(nèi)定義關(guān)聯(lián)類
  • 依賴關(guān)系:傳參
  • 聚合關(guān)系
  • 組合關(guān)系


2斤程、單一職責(zé)原則

  • 就一個(gè)類而言角寸,僅有一個(gè)引起類變化的原因
  • 軟件設(shè)計(jì)要做的內(nèi)容:發(fā)現(xiàn)職責(zé),把職責(zé)相互分離

3忿墅、開放-封閉原則

  • 軟件實(shí)體(類扁藕、模塊、函數(shù))推薦擴(kuò)展球匕,不宜修改
  • 對(duì)擴(kuò)展開放纹磺,對(duì)更改封閉
    • 多擴(kuò)展、少修改
    • 設(shè)計(jì)出易維護(hù)亮曹、不易出問題的最好方法

4橄杨、依賴倒轉(zhuǎn)原則

  • 高層模塊不依賴底層模塊,而都應(yīng)該依賴抽象(接口)
  • 抽象不依賴細(xì)節(jié)照卦,而應(yīng)細(xì)節(jié)依賴抽象
  • 針對(duì)接口編程式矫,不對(duì)實(shí)現(xiàn)編程

5、里氏代換原則

  • 子類型必須能夠替換掉它的父類型
  • 即是能實(shí)現(xiàn)多態(tài)役耕?

6采转、迪米特法則

  • 兩個(gè)類不必彼此直接通信的話,那么兩個(gè)類不應(yīng)發(fā)生直接相互作用
  • 例子:IT部報(bào)到瞬痘,小張故慈,小李
  • 強(qiáng)調(diào)松耦合

7、方法過長(zhǎng)是壞味道

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末框全,一起剝皮案震驚了整個(gè)濱河市察绷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌津辩,老刑警劉巖拆撼,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異喘沿,居然都是意外死亡闸度,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門蚜印,熙熙樓的掌柜王于貴愁眉苦臉地迎上來莺禁,“玉大人,你說我怎么就攤上這事晒哄≌鲈祝” “怎么了肪获?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)柒傻。 經(jīng)常有香客問我孝赫,道長(zhǎng),這世上最難降的妖魔是什么红符? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任青柄,我火速辦了婚禮,結(jié)果婚禮上预侯,老公的妹妹穿的比我還像新娘致开。我一直安慰自己,他們只是感情好萎馅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布双戳。 她就那樣靜靜地躺著,像睡著了一般糜芳。 火紅的嫁衣襯著肌膚如雪飒货。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天峭竣,我揣著相機(jī)與錄音塘辅,去河邊找鬼。 笑死皆撩,一個(gè)胖子當(dāng)著我的面吹牛扣墩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扛吞,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼呻惕,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了滥比?” 一聲冷哼從身側(cè)響起蟆融,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎守呜,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體山憨,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡查乒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了郁竟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玛迄。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖棚亩,靈堂內(nèi)的尸體忽然破棺而出蓖议,到底是詐尸還是另有隱情虏杰,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布勒虾,位于F島的核電站纺阔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏修然。R本人自食惡果不足惜笛钝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望愕宋。 院中可真熱鬧玻靡,春花似錦、人聲如沸中贝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)邻寿。三九已至蝎土,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工缘屹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宿亡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓丈积,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丹壕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 設(shè)計(jì)模式基本原則 開放-封閉原則(OCP),是說軟件實(shí)體(類薇溃、模塊菌赖、函數(shù)等等)應(yīng)該可以拓展,但是不可修改沐序。開-閉原...
    西山薄涼閱讀 3,792評(píng)論 3 14
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法琉用,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法策幼,繼承相關(guān)的語(yǔ)法邑时,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 31,623評(píng)論 18 399
  • 今天學(xué)習(xí)下最常見的工廠模式特姐,工廠模式細(xì)分下來有三大類: 他們的目標(biāo)都是一樣的:封裝對(duì)象的創(chuàng)建晶丘。但是實(shí)現(xiàn)手段和使用場(chǎng)...
    西木柚子閱讀 2,148評(píng)論 7 28
  • 設(shè)計(jì)模式匯總 一、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 3,939評(píng)論 1 15
  • 一浅浮、設(shè)計(jì)模式的分類 總體來說設(shè)計(jì)模式分為三大類: 創(chuàng)建型模式沫浆,共五種:工廠方法模式、抽象工廠模式滚秩、單例模式专执、建造者...
    RamboLI閱讀 749評(píng)論 0 1