[GeekBand][C++設(shè)計模式]第一周筆記

1. 課程簡介

本周開始進(jìn)入到《C++設(shè)計模式》課程中映砖。

A. 課程目標(biāo)

a. 理解松耦合設(shè)計思想
b. 掌握面向?qū)ο笤O(shè)計原則
c. 掌握重構(gòu)技法改善設(shè)計
d. 掌握GOF核心設(shè)計模式

B. 什么是設(shè)計模式

設(shè)計模式描述了一個重復(fù)發(fā)生的問題及該問題解決方案的核心澳迫。其目的在于提高軟件設(shè)計過程中代碼的復(fù)用率魁蒜,提高代碼抵抗變化的能力恩袱。

本課程以面向?qū)ο鬄榛A(chǔ)瓶堕,主要學(xué)習(xí)掌握“好的面向?qū)ο笤O(shè)計”败砂。

2. 面向?qū)ο笤O(shè)計原則

面向?qū)ο笤O(shè)計原則在很多時候比具體的設(shè)計模式更為重要辨嗽,設(shè)計模式是這些設(shè)計原則的實(shí)現(xiàn)世落。

A. 依賴倒置原則(DIP)
  • 高層模塊(穩(wěn)定)不應(yīng)該依賴于低層模塊(變化),二者都應(yīng)該依賴于抽象(穩(wěn)定)糟需。
  • 抽象(穩(wěn)定)不應(yīng)該依賴于實(shí)現(xiàn)細(xì)節(jié)(變化)屉佳,實(shí)現(xiàn)細(xì)節(jié)應(yīng)該依賴于抽象(穩(wěn)定)。
B. 開放封閉原則(OCP)
  • 對擴(kuò)展開放洲押,對更改封閉武花。
  • 類模塊應(yīng)該是可擴(kuò)展的,但是不可修改杈帐。
C. 單一職責(zé)原則(SRP)
  • 一個類應(yīng)該僅有一個引起它變化的原因体箕。
  • 變化的方向隱含著類的責(zé)任。
D. Liskov 替換原則(LSP)
  • 子類必須能夠替換它們的基類(is-a)挑童。
  • 繼承表達(dá)類型抽象
E. 接口隔離原則(ISP)
  • 不應(yīng)該強(qiáng)迫客戶程序依賴它們不用的方法累铅。
  • 接口應(yīng)小而完備。
F. 優(yōu)先使用對象組合站叼,而不是類繼承
  • 類繼承通常為“白箱復(fù)用”娃兽,對象組合通常為“黑箱復(fù)用”。
  • 繼承在某種程度上破壞了封裝性尽楔,子類父類耦合度高投储。
  • 而對象組合則只要求被組合的對象具有良好定義的接口,耦合度低阔馋。
G. 封裝變化點(diǎn)
  • 使用封裝來創(chuàng)建對象之間的分界層玛荞,讓設(shè)計者可以在分界層一側(cè)進(jìn)行修改,而不會對另一側(cè)產(chǎn)生不良的影響呕寝,從而實(shí)現(xiàn)層次間的松耦合冲泥。
H. 針對接口編程,而不是針對實(shí)現(xiàn)編程
  • 不將變量類型聲明為某個特定的具體類,而是聲明為某個接口凡恍。
  • 客戶程序無需獲知對象的具體類型,只需要知道對象所具有的接口怔球。
  • 減少系統(tǒng)中各部分的依賴關(guān)系嚼酝,從而實(shí)現(xiàn)“高內(nèi)聚,松耦合”的類型設(shè)計方案竟坛。

3. 從封裝變化角度對模式分類

A. 組件協(xié)作
  • Template Method
  • Strategy
  • Observer / Event
B. 單一職責(zé)
  • Decorator
  • Bridge
C. 對象創(chuàng)建
  • Factory Method
  • Abstract Factory
  • Prototype
  • Builder
D. 對象性能
  • Singleton
  • Flyweight
E. 接口隔離
  • Facade
  • Proxy
  • Mediator
  • Adapter
F. 狀態(tài)變化
  • Memento
  • State
G. 數(shù)據(jù)結(jié)構(gòu)
  • Composite
  • Iterator
  • Chain of Resposibility
H. 行為變化
  • Command
  • Visitor
I. 領(lǐng)域問題
  • Interpreter

4. 重構(gòu)關(guān)鍵技法

  • 靜態(tài)->動態(tài)
  • 早綁定->晚綁定
  • 繼承->組合
  • 編譯時依賴->運(yùn)行時依賴
  • 緊耦合->松耦合

5. “組件協(xié)作”模式

現(xiàn)代軟件專業(yè)分工之后的第一個結(jié)果是“框架與應(yīng)用程序的劃分”闽巩,“組件協(xié)作”模式通過晚期綁定,來實(shí)現(xiàn)框架與應(yīng)用程序之間的松耦合担汤,是二者之間協(xié)作時常用的模式涎跨。

A. 模板方法(Template Method)

  • 動機(jī)
    在軟件構(gòu)建過程中,對于某一項(xiàng)任務(wù)崭歧,它常常有穩(wěn)定的整體操作結(jié)構(gòu)隅很,但各個子步驟卻有很多改變的需求,或者由于固有的原因(比如框架與應(yīng)用之間的關(guān)系)而無法和任務(wù)的整體結(jié)構(gòu)同時實(shí)現(xiàn)率碾。
    如何在確定穩(wěn)定操作結(jié)構(gòu)的前提下叔营,來靈活應(yīng)對各個子步驟的變化或者晚期實(shí)現(xiàn)需求?


    優(yōu)化前流程
    優(yōu)化后流程
    模式定義
    結(jié)構(gòu)
    要點(diǎn)總結(jié)

B. 策略模式(Strategy)

  • 動機(jī)
    在軟件構(gòu)建過程中所宰,某些對象使用的算法可能多種多樣绒尊,經(jīng)常改變,如果將這些算法都編碼到對象中仔粥,將會使對象變得異常復(fù)雜婴谱;而且有時候支持不使用的算法也是一個性能負(fù)擔(dān)。
    如何在在運(yùn)行時根據(jù)需要透明地理性對象的算法躯泰?將算法與對象本身解耦谭羔,從而避免上述問題?


    模式定義
    結(jié)構(gòu)
    要點(diǎn)總結(jié)

C. 觀察者模式(Observer)

  • 動機(jī)
    在軟件構(gòu)建過程中斟冕,我們需要為某些對象建立一種“通知依賴關(guān)系”——一個對象(目標(biāo)對象)的狀態(tài)發(fā)生改變口糕,所有的依賴對象(觀察者對象)都將得到通知。如果這樣的依賴關(guān)系過于緊密磕蛇,將使軟件不能很好地抵御變化景描。
    使用變身對象技術(shù),可以將這種依賴關(guān)系弱化秀撇,并形成一種穩(wěn)定的依賴關(guān)系超棺。從而實(shí)現(xiàn)軟件體系結(jié)構(gòu)的松耦合。


    模式定義
    結(jié)構(gòu)
    要點(diǎn)總結(jié)

6. “單一職責(zé)”模式

在軟件組件的設(shè)計中呵燕,如果責(zé)任劃分不清晰棠绘,使用繼承得到的結(jié)果往往是隨著需求的變化,子類急劇膨脹,同時充斥著重復(fù)代碼氧苍,這時候的關(guān)鍵是劃清責(zé)任夜矗。

A. 裝飾模式(Decorator)

  • 動機(jī)
    在某些情況下我們可能會“過度地使用繼承來擴(kuò)展對象的功能”,由于繼承為類型引入的靜態(tài)特質(zhì)让虐,使得這種擴(kuò)展方式缺乏靈活性紊撕;并且隨著子類的增多(擴(kuò)展功能的增多),各種子類的組合(擴(kuò)展功能的組合)會導(dǎo)致更多子類的膨脹赡突。
    如何使“對象功能的擴(kuò)展”能夠根據(jù)需要來動態(tài)地實(shí)現(xiàn)对扶?同時避免“擴(kuò)展功能的增多”帶來的子類膨脹問題?從而使得任何“功能擴(kuò)展變化”所導(dǎo)致的影響降為最低惭缰?


    模式定義
    結(jié)構(gòu)
    要點(diǎn)總結(jié)

B. 橋模式(Bridge)

  • 動機(jī)
    由于某些類型的固有的實(shí)現(xiàn)邏輯浪南,使得它們具有兩個變化的維度,乃至多個維度的變化漱受。
    如何應(yīng)對這種“多維度的變化”络凿?如何利用面向?qū)ο蠹夹g(shù)來使得類型可以輕松地沿著兩個乃至多個方向變化,而不引入額外的復(fù)雜度拜效?


    模式定義
    結(jié)構(gòu)
    要點(diǎn)總結(jié)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末喷众,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子紧憾,更是在濱河造成了極大的恐慌到千,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,294評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赴穗,死亡現(xiàn)場離奇詭異憔四,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)般眉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評論 3 385
  • 文/潘曉璐 我一進(jìn)店門了赵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人甸赃,你說我怎么就攤上這事柿汛。” “怎么了埠对?”我有些...
    開封第一講書人閱讀 157,790評論 0 348
  • 文/不壞的土叔 我叫張陵络断,是天一觀的道長。 經(jīng)常有香客問我项玛,道長貌笨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,595評論 1 284
  • 正文 為了忘掉前任襟沮,我火速辦了婚禮锥惋,結(jié)果婚禮上昌腰,老公的妹妹穿的比我還像新娘。我一直安慰自己膀跌,他們只是感情好遭商,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捅伤,像睡著了一般株婴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上暑认,一...
    開封第一講書人閱讀 49,906評論 1 290
  • 那天,我揣著相機(jī)與錄音大审,去河邊找鬼蘸际。 笑死,一個胖子當(dāng)著我的面吹牛徒扶,可吹牛的內(nèi)容都是我干的粮彤。 我是一名探鬼主播,決...
    沈念sama閱讀 39,053評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼姜骡,長吁一口氣:“原來是場噩夢啊……” “哼导坟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起圈澈,我...
    開封第一講書人閱讀 37,797評論 0 268
  • 序言:老撾萬榮一對情侶失蹤惫周,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后康栈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體递递,經(jīng)...
    沈念sama閱讀 44,250評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評論 2 327
  • 正文 我和宋清朗相戀三年啥么,在試婚紗的時候發(fā)現(xiàn)自己被綠了登舞。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,711評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡悬荣,死狀恐怖菠秒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情氯迂,我是刑警寧澤践叠,帶...
    沈念sama閱讀 34,388評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站囚戚,受9級特大地震影響酵熙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜驰坊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評論 3 316
  • 文/蒙蒙 一匾二、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦察藐、人聲如沸皮璧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悴务。三九已至,卻和暖如春譬猫,著一層夾襖步出監(jiān)牢的瞬間讯檐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評論 1 266
  • 我被黑心中介騙來泰國打工染服, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留别洪,地道東北人。 一個月前我還...
    沈念sama閱讀 46,461評論 2 360
  • 正文 我出身青樓柳刮,卻偏偏與公主長得像挖垛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子秉颗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評論 2 350

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

  • 設(shè)計模式簡介: 什么是設(shè)計模式痢毒?每一個模式描述了一個在我們周圍不斷重復(fù)發(fā)生的問題,以及該問題的解決方案的核心蚕甥。這樣...
    hjsadam閱讀 332評論 0 2
  • 設(shè)計模式基本原則 開放-封閉原則(OCP)哪替,是說軟件實(shí)體(類、模塊梢灭、函數(shù)等等)應(yīng)該可以拓展夷家,但是不可修改。開-閉原...
    西山薄涼閱讀 3,777評論 3 14
  • C++設(shè)計模式是本周開始的一門全新的課程敏释,在完成了第一周的學(xué)習(xí)之后库快,對C++設(shè)計模式有了一定的認(rèn)識和了解,因此有一...
    GINNYAK閱讀 639評論 0 3
  • 1.設(shè)計模式簡介 課程目標(biāo) 松耦合設(shè)計思想 面向?qū)ο笤O(shè)計原則 重構(gòu)技法改善設(shè)計 GOF核心設(shè)計模式 設(shè)計模式 不斷...
    hui1429閱讀 212評論 0 0
  • 本周課程主要內(nèi)容為:C++設(shè)計模式簡介钥顽、面向?qū)ο笤O(shè)計八大原則和DOF-23設(shè)計模式中的5中模式义屏,包括templat...
    cayhw閱讀 486評論 0 3