本文預(yù)覽:
- 設(shè)計(jì)模式簡介
- 軟件設(shè)計(jì)固有的復(fù)雜性
- 如何解決復(fù)雜性
- 軟件設(shè)計(jì)的目標(biāo)
- 設(shè)計(jì)模式六大原則
- 組件協(xié)作模式
- 模板方法
- 策略模式
- 觀察者模式
- 裝飾模式
- 橋模式
設(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)。
重構(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í)際寫一遍還是很有收獲的家厌。