本文原創(chuàng)该押,轉(zhuǎn)載請(qǐng)注明出處筒主。
歡迎關(guān)注我的 簡(jiǎn)書 撕捍,關(guān)注我的專題 Android Class 我會(huì)長(zhǎng)期堅(jiān)持為大家收錄簡(jiǎn)書上高質(zhì)量的 Android 相關(guān)博文迈嘹。
周末了擁有大塊時(shí)間师脂,是一個(gè)充電的好時(shí)機(jī),本文給大家?guī)碓O(shè)計(jì)模式的讀書筆記江锨,希望能給你帶來一些幫助。
設(shè)計(jì)模式
在軟件工程中糕篇,設(shè)計(jì)模式是對(duì)軟件設(shè)計(jì)中普遍存在啄育、反復(fù)出現(xiàn)的各種問題所提出的通用解決方案。這個(gè)術(shù)語是由 Erich Gamma 等人在1990 年從建筑設(shè)計(jì)領(lǐng)域引入到軟件工程領(lǐng)域拌消,從此設(shè)計(jì)模式在面向?qū)ο笤O(shè)計(jì)領(lǐng)域逐漸被重視起來挑豌。
設(shè)計(jì)模式并不直接用來完成代碼的編寫,而是描述在各種情況下要如何解決軟件設(shè)計(jì)問題墩崩。面向?qū)ο笤O(shè)計(jì)模式通常以類或?qū)ο髞砻枋銎渲械年P(guān)系和相互作用氓英,他們的相互作用能夠使軟件系統(tǒng)具有高內(nèi)聚、低耦合的特性鹦筹,并且使軟件能夠應(yīng)對(duì)變化铝阐。
模式的4個(gè)要素
模式名稱
模式名稱用一兩個(gè)詞來描述模式的問題、解決防范和效果铐拐∨羌基于一個(gè)模式詞匯表练对,同行、同事之間就可以通過它們進(jìn)行交流吹害,文檔中也可以通過模式名來代表一個(gè)設(shè)計(jì)螟凭。模式名可以幫助我們思考,便于我們與其他人交流設(shè)計(jì)思想以及設(shè)計(jì)結(jié)果它呀。
問題
描述了應(yīng)該在什么情況使用設(shè)計(jì)模式螺男。它解釋了設(shè)計(jì)問題和問題存在的前因后果,它可能描述了特定的設(shè)計(jì)問題纵穿,例如下隧,某個(gè)設(shè)計(jì)不具備良好的可擴(kuò)展性等,也可能描述了導(dǎo)致不靈活設(shè)計(jì)的類或者對(duì)象結(jié)構(gòu)政恍。
解決方案
描述了設(shè)計(jì)的組成成分汪拥,它們之間的相互關(guān)系以及各自的職責(zé)和協(xié)作方式。因?yàn)槟J骄拖褚粋€(gè)模板篙耗,可應(yīng)用于多種不同的場(chǎng)合迫筑,所以解決方案并不描述一個(gè)具體的設(shè)計(jì)或者實(shí)現(xiàn),而是提供設(shè)計(jì)問題的抽象描述和怎樣用一個(gè)具有一般意義的類或者對(duì)象組合來解決這個(gè)問題宗弯。
效果
描述了模式應(yīng)用的效果及使用模式應(yīng)權(quán)衡的問題脯燃。盡管我們描述設(shè)計(jì)決策時(shí),并不總提到模式效果蒙保,但它們對(duì)于評(píng)價(jià)設(shè)計(jì)選擇和理解使用模式的代價(jià)及好處具有重要意義辕棚。軟件效果大多關(guān)注對(duì)時(shí)間和空間的衡量,它們也表述了語言和實(shí)現(xiàn)問題邓厕。因?yàn)閺?fù)用是面向?qū)ο蟮脑O(shè)計(jì)要素之一逝嚎。所以模式效果包括對(duì)它系統(tǒng)的靈活性、擴(kuò)充性或可移植性的影響详恼,顯式地列出這些效果對(duì)理解和評(píng)價(jià)這些模式很有幫助补君。
設(shè)計(jì)模式為反復(fù)出現(xiàn)的局部軟件設(shè)計(jì)問題指出了通用的解決方案,在很大程度上促進(jìn)了面向?qū)ο筌浖こ痰陌l(fā)展昧互。它將這些常見的設(shè)計(jì)問題一一總結(jié)挽铁,將大師們的經(jīng)驗(yàn)、教訓(xùn)敞掘、設(shè)計(jì)經(jīng)驗(yàn)分享給了所有人叽掘,使得即便是剛剛?cè)胄械墓こ處煟材軌蛟O(shè)計(jì)出可擴(kuò)展玖雁、靈活的軟件系統(tǒng)更扁,大大提升了軟件質(zhì)量。關(guān)于設(shè)計(jì)模式領(lǐng)域的書籍大家可以參考《設(shè)計(jì)模式之禪》、《Android 源碼設(shè)計(jì)模式解析與實(shí)戰(zhàn)》疯潭。
避免掉進(jìn)過度設(shè)計(jì)的怪圈
當(dāng)你掌握一些設(shè)計(jì)模式或者手法之后赊堪,比較容易出現(xiàn)的問題就是過度設(shè)計(jì)。有的人甚至在一個(gè)應(yīng)用中一定要將 23 種常見的設(shè)計(jì)模式運(yùn)用上竖哩,這就本末倒置了哭廉。設(shè)計(jì)模式的四大要素中就明確指出,模式的運(yùn)用應(yīng)該根據(jù)軟件系統(tǒng)所面臨的問題來決定是否需要使用現(xiàn)有的設(shè)計(jì)相叁。也就是說遵绰,再出現(xiàn)問題或者你預(yù)計(jì)會(huì)出現(xiàn)那樣的問題時(shí),才推薦使用特定的設(shè)計(jì)模式增淹,而不是將各種設(shè)計(jì)模式套進(jìn)你的軟件中椿访。
不管在設(shè)計(jì)、實(shí)現(xiàn)虑润、測(cè)試之劍有多少時(shí)間都應(yīng)該避免過度設(shè)計(jì)成玫,它會(huì)打破你的反饋回路,使你的設(shè)計(jì)得不到反饋拳喻,從而慢慢陷入危險(xiǎn)中哭当。所以你只需要保持簡(jiǎn)單的設(shè)計(jì),這樣就有時(shí)間來測(cè)試該設(shè)計(jì)是否真的可行冗澈,然后作出最后的決策钦勘。
當(dāng)設(shè)計(jì)一款軟件時(shí),從整體高度上設(shè)定一種架構(gòu)模式亚亲,確定應(yīng)用的整體架構(gòu)彻采,然后再分析一些重要米快的設(shè)計(jì)思路,并且保證他們的簡(jiǎn)單性捌归、清晰性肛响,如果有時(shí)間可以使用 Java 代碼模擬一個(gè)簡(jiǎn)單的原型,確保設(shè)計(jì)是可行的惜索,最后就可以付諸行動(dòng)了特笋。切實(shí)不要過度的追求設(shè)計(jì),適當(dāng)就好门扇,當(dāng)我們發(fā)現(xiàn)或者預(yù)計(jì)到將要出現(xiàn)問題時(shí),在判斷是否需要運(yùn)用設(shè)計(jì)模式偿渡。
反模式
反模式是一種文字記錄形式臼寄,描述了對(duì)某個(gè)問題必然產(chǎn)生的消極后果的常見解決方案。由于管理人員或者開發(fā)人員不知道更好的解決方案溜宽,缺乏決定特定問題的經(jīng)驗(yàn)或知識(shí)吉拳,或者說不適合的條件下套用了某個(gè)設(shè)計(jì)模式,這些都會(huì)造成反模式适揉。與設(shè)計(jì)模式類似留攒,反模式描述了一個(gè)一般的形式煤惩,主要原因、典型癥狀炼邀。后果魄揉,以及最后如何通過重構(gòu)解決問題。
反模式是把一般情況映射到一類特定解決方案的有效方法拭宁。反模式的一般形式為它所針對(duì)的哪類問題提供了一個(gè)易于辨識(shí)的模板洛退。此外,它還清楚地說明了與該問題相關(guān)聯(lián)的癥狀以及導(dǎo)致這一問題的內(nèi)在原因:把特定設(shè)計(jì)模式應(yīng)用于不正確的環(huán)境杰标。
反模式為識(shí)別軟件行業(yè)反復(fù)出現(xiàn)的問題提供了實(shí)際經(jīng)驗(yàn)兵怯,并為大多數(shù)常見的問題提供了詳細(xì)的解決方案。反模式對(duì)業(yè)界常見的問題進(jìn)行總結(jié)腔剂,并且告訴你如何識(shí)別這些問題以及如何解決媒区。它有效的說明了可以在不同的層次上采取的措施,以便改善應(yīng)用開發(fā)過程掸犬,軟件系統(tǒng)和對(duì)軟件項(xiàng)目的有效管理袜漩。
總的來說,設(shè)計(jì)模式總結(jié)了在特定問題下正確的解決方案登渣,而反模式則是告訴你在特定問題上的錯(cuò)誤解決方案和他們的原因噪服、解決方案,通過最終的解決方案胜茧,它能夠?qū)⒏能浖到y(tǒng)拉回正軌粘优。
總結(jié)
靈活的軟件設(shè)計(jì)需要知識(shí)和經(jīng)驗(yàn)與思考,好的設(shè)計(jì)通常是經(jīng)歷了時(shí)間的洗禮慢慢演化而來呻顽,工程師的成長(zhǎng)也是一樣雹顺。因此,掌握必要的面向?qū)ο罄缺椤⒃O(shè)計(jì)模式嬉愧、反模式等知識(shí),并且這工作中不斷實(shí)踐喉前、思考没酣,將使你的軟件設(shè)計(jì)之路走得更加從容、順暢卵迂。