C++設(shè)計(jì)模式(1)

本文預(yù)覽:

  • 設(shè)計(jì)模式簡介
    • 軟件設(shè)計(jì)固有的復(fù)雜性
    • 如何解決復(fù)雜性
    • 軟件設(shè)計(jì)的目標(biāo)
  • 設(shè)計(jì)模式六大原則
  • 組件協(xié)作模式
    • 模板方法
    • 策略模式
    • 觀察者模式
  • 裝飾模式
  • 橋模式

設(shè)計(jì)模式簡介

設(shè)計(jì)模式

歷史性著作《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌?件的基礎(chǔ)》一書中 述了23種經(jīng)典面向?qū)ο?設(shè)計(jì)模式,創(chuàng)立了模式在軟件設(shè)計(jì)中的地位玖喘。GoF(GoF is simple of Gang of Four)這本書名聲有多大,幾乎無人不知無人不曉,堪稱《九陰真經(jīng)》心法,既然是心法梯刚,那可不是一朝一夕就可練成的勺远。在軟件設(shè)計(jì)界,此書幾乎人手一本雁佳,但是涨享,然并卵筋搏,此書閑置率也堪稱絕世經(jīng)典,即使此書讀了上百遍灰伟,依然不能在實(shí)際應(yīng)用中有所建樹拆又,這就是心法儒旬。

軟件設(shè)計(jì)固有的復(fù)雜性

建筑商從來不會(huì)去想給一棟已建好的100層高的 樓房底下再新修一個(gè)小地下室——這樣做花費(fèi)極 大而且注定要失敗栏账。然而令人驚奇的是,軟件系統(tǒng)的用戶在要求作出類似改變時(shí)卻不會(huì)仔細(xì)考慮, 而且他們認(rèn)為這只是需要簡單編程的事。
——Object-Oriented Analysis and Design with Applications

軟件設(shè)計(jì)為什么那么復(fù)雜栈源,很多時(shí)候項(xiàng)目經(jīng)理說要添加一個(gè)需求挡爵,程序說加不了,于是經(jīng)理說甚垦,不就是改兩行代碼嗎茶鹃。其實(shí)涣雕,在很多情況下相當(dāng)于,我蓋好了一棟大樓
經(jīng)理:我要加一個(gè)地下室闭翩。
工程師:加不了挣郭。
經(jīng)理:不就是加一個(gè)地下室嗎?
顯然沒有這么無知的經(jīng)理疗韵,但是在軟件領(lǐng)域兑障,確實(shí)是有這么無知的產(chǎn)品經(jīng)理,因?yàn)椴皇撬械娜硕级密浖O(shè)計(jì)蕉汪,但是幾乎所有的人都知道怎么蓋大樓流译。

那么軟件設(shè)計(jì)為什么如此復(fù)雜?
根本原因在于變化者疤。一是福澡,客戶需求反復(fù)無常,一會(huì)這樣一會(huì)那樣驹马,剛蓋好三層樓拆掉重蓋也不是沒有可能革砸。二是,技術(shù)團(tuán)隊(duì)變化窥翩,資本主義社會(huì)不再像美好的社會(huì)主義业岁,市場經(jīng)濟(jì)下,人才流動(dòng)是常常發(fā)生的事寇蚊,總工程師帶著小弟去創(chuàng)業(yè)了笔时,如果之前沒有完善的文檔,那么仗岸,誰來接手這個(gè)燙手的山芋允耿。三是,技術(shù)平臺(tái)變化扒怖,十年前誰能想到较锡,我們現(xiàn)在人手一部智能手機(jī),原來花了幾百萬開發(fā)的跑在windows上的程序能不能跑在iphone上盗痒?四是蚂蕴,市場環(huán)境變化,媽了個(gè)蛋的俯邓,誰曾想到骡楼,半年前確定的開發(fā)一套造自行車的ERP系統(tǒng),今天你說我要轉(zhuǎn)行去做房地產(chǎn)稽鞭,把原來的系統(tǒng)改成房地產(chǎn)ERP系統(tǒng)鸟整。
變化,這才是軟件設(shè)計(jì)領(lǐng)域要解決的最頭等的大事朦蕴,試想篮条,蓋好的大樓弟头,誰會(huì)拆了加一個(gè)地下室,但是軟件設(shè)計(jì)領(lǐng)域會(huì)涉茧,一個(gè)好的架構(gòu)赴恨,不止能加地下室,還能把大樓改造成鋼鐵俠(純扯淡)伴栓。

如何解決復(fù)雜性

面對一個(gè)一臉懵逼的問題嘱支,我們?nèi)绾蚊鎸Γ?/p>

  • 分解
  • 抽象

分解:一個(gè)復(fù)雜的問題,人類如何面對挣饥,分解成一個(gè)個(gè)小的除师,簡單的問題,逐個(gè)擊破扔枫。這就是人類解決問題最基本的方法汛聚。
抽象:其實(shí)一切高于自然的東西都是抽象出來的,社會(huì)短荐、法律倚舀、制度......這是人類統(tǒng)治世界的終極大招。由于不能掌握全部的復(fù)雜對象,我們選擇忽視它的非本質(zhì)細(xì)節(jié), 而去處理泛化和理想化了的對象模型忍宋。
這兩種方法是通用方法痕貌,研究數(shù)學(xué)也是用到這兩種方法,一種是泛化(抽象)糠排,一種是特化(分解)舵稠。

軟件設(shè)計(jì)的目標(biāo)

什么是好的軟件設(shè)計(jì),軟件設(shè)計(jì)的金科玉律:復(fù)用

設(shè)計(jì)模式六大原則

六大設(shè)計(jì)原則是心法的心法入宦,所有設(shè)計(jì)模式都是遵循這六大原則演變來的哺徊,雖然晦澀難懂,但是既然是心法的心法乾闰,即使不懂怎么用落追,背出來裝裝逼也是可以的。

  • 依賴倒置原則

  • 高層模塊(穩(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)定)病苗。

  • 開放封閉原則

    • 對擴(kuò)展開放疗垛,對更改封閉
    • 類模塊應(yīng)該是可擴(kuò)展的,但是不可修改
  • 單一職責(zé)原則

  • 一個(gè)類應(yīng)該只有一個(gè)引起它變化的原因

  • 變化的方向隱含著類的責(zé)任

  • Liskov替換原則

  • 子類必須能夠替換它們的基類(IS-A)

  • 繼承表達(dá)類型抽象

  • 接口隔離原則

  • 不應(yīng)該強(qiáng)迫客戶程序依賴它們不用的方法

  • 接口應(yīng)該小而完備

  • 優(yōu)先使用對象組合,而不是類繼承

  • 繼承在某種程度上破壞了封裝性,子類父類耦合度高

  • 而對象組合則只要求被組合的對象具有良好定義的接口,耦合 度低

重構(gòu)獲得模式

看完這六大原則铅乡,不管是不是理解了继谚,是不是在寫代碼的時(shí)候直接就可以用上了呢烈菌?一副都起開阵幸,老衲要開始裝逼了的樣子花履。然而并不是,設(shè)計(jì)模式的應(yīng)用不宜先入為主,一上來就使用設(shè)計(jì)模式是對設(shè)計(jì) 模式的最大誤用挚赊。沒有一步到位的設(shè)計(jì)模式诡壁。敏捷軟件開發(fā)實(shí)踐提倡的“Refactoring to Patterns”是目前普遍公認(rèn)的最好的使用設(shè)計(jì)模式的方法。

現(xiàn)代軟件設(shè)計(jì)的特征是“需求的頻繁變化”荠割。設(shè)計(jì)模式的要點(diǎn)是 “尋找變化點(diǎn),然后在變化點(diǎn)處應(yīng)用設(shè)計(jì)模式,從而來更好地應(yīng)對 需求的變化”.“什么時(shí)候妹卿、什么地點(diǎn)應(yīng)用設(shè)計(jì)模式”比“理解設(shè)計(jì) 模式結(jié)構(gòu)本身”更為重要。

我相信看到這的你蔑鹦,是懵逼的夺克,說了這么久,設(shè)計(jì)模式不是一樣來就用的(除非你對業(yè)務(wù)模型非常了解嚎朽,和之前做過的項(xiàng)目一樣的)铺纽,而是通過重構(gòu)。

關(guān)于重構(gòu)的經(jīng)典書籍

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

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

組件協(xié)作模式

現(xiàn)代軟件專業(yè)分工后的第一個(gè)結(jié)果是框架與應(yīng)用程序的劃分哟忍,組件協(xié)作模式通過晚綁定狡门,來實(shí)現(xiàn)框架與應(yīng)用程序之間的松耦合,是二者之間協(xié)作時(shí)的常用模式锅很。

典型模式

  • 模板方法
  • 策略模式
  • 觀察者模式

關(guān)于這些模式的代碼演示和解釋見下面鏈接:
模板方法
策略模式
觀察者模式
這幾篇是我讀過的算是解釋的非常清楚簡介的文章了其馏,代碼有些是用java寫的樟氢,可能作者比較懶贷痪,直接抄的《大話設(shè)計(jì)模式》,自己實(shí)際寫一遍還是很有收獲的家厌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扔仓,一起剝皮案震驚了整個(gè)濱河市致扯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌当辐,老刑警劉巖抖僵,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缘揪,居然都是意外死亡耍群,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進(jìn)店門找筝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蹈垢,“玉大人,你說我怎么就攤上這事袖裕〔芴В” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵急鳄,是天一觀的道長谤民。 經(jīng)常有香客問我堰酿,道長,這世上最難降的妖魔是什么张足? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任触创,我火速辦了婚禮,結(jié)果婚禮上为牍,老公的妹妹穿的比我還像新娘哼绑。我一直安慰自己,他們只是感情好碉咆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布抖韩。 她就那樣靜靜地躺著,像睡著了一般疫铜。 火紅的嫁衣襯著肌膚如雪帽蝶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天块攒,我揣著相機(jī)與錄音励稳,去河邊找鬼。 笑死囱井,一個(gè)胖子當(dāng)著我的面吹牛驹尼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播庞呕,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼新翎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了住练?” 一聲冷哼從身側(cè)響起地啰,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎讲逛,沒想到半個(gè)月后亏吝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盏混,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年蔚鸥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片许赃。...
    茶點(diǎn)故事閱讀 38,747評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡止喷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出混聊,到底是詐尸還是另有隱情弹谁,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站预愤,受9級特大地震影響沟于,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鳖粟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拙绊。 院中可真熱鬧向图,春花似錦、人聲如沸标沪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽金句。三九已至檩赢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間违寞,已是汗流浹背贞瞒。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留趁曼,地道東北人军浆。 一個(gè)月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像挡闰,于是被迫代替她去往敵國和親乒融。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評論 2 350

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

  • 面向?qū)ο笤O(shè)計(jì)原則 單一職責(zé)原則(SRP) 一個(gè)類應(yīng)該只負(fù)責(zé)一項(xiàng)職責(zé)摄悯,即只承擔(dān)某一項(xiàng)功能赞季。一個(gè)類應(yīng)該僅有一個(gè)引起它變...
    lamont閱讀 271評論 0 0
  • 1.什么是好的軟件設(shè)計(jì)?軟件設(shè)計(jì)的金科玉律:復(fù)用 2.設(shè)計(jì)模式八大原則 依賴倒置原則(DIP)高層模塊(穩(wěn)定)不應(yīng)...
    胖胖核桃閱讀 520評論 0 0
  • 具體詳見我的博客:(作業(yè)的碼在博客最后)design patterns責(zé)任是思考面向?qū)ο笤O(shè)計(jì)的一個(gè)觀點(diǎn)從概念層面奢驯,...
    TACITURNLY閱讀 294評論 0 0
  • 轉(zhuǎn)載標(biāo)注聲明:http://www.uml.org.cn/sjms/201211023.asp 目錄:[設(shè)計(jì)模式六...
    Bloo_m閱讀 707評論 0 7
  • 設(shè)計(jì)模式六大原則(1):單一職責(zé)原則 定義:不要存在多于一個(gè)導(dǎo)致類變更的原因申钩。通俗的說,即一個(gè)類只負(fù)責(zé)一項(xiàng)職責(zé)瘪阁。 ...
    Jabir_Zhang閱讀 644評論 0 3