如何掌握并在实践中自如运用设计模式
生活随笔
收集整理的這篇文章主要介紹了
如何掌握并在实践中自如运用设计模式
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
設(shè)計(jì)模式是面向?qū)ο缶幊痰臒衢T(mén)話(huà)題之一,越來(lái)越多的開(kāi)發(fā)人員認(rèn)識(shí)到設(shè)計(jì)模式的重要性。采用各種語(yǔ)言實(shí)現(xiàn)設(shè)計(jì)模式的文章也越來(lái)越多,但是很多開(kāi)發(fā)人員發(fā)現(xiàn)很難將設(shè)計(jì)模式與實(shí)際開(kāi)發(fā)中需要解決的具體問(wèn)題相聯(lián)系。因?yàn)槭褂迷O(shè)計(jì)模式的難點(diǎn)往往不在于模式的實(shí)現(xiàn),而在于很難確定哪種模式可以在現(xiàn)實(shí)的應(yīng)用場(chǎng)景中采用,從而導(dǎo)致了在現(xiàn)實(shí)的項(xiàng)目中,面對(duì)客戶(hù)的壓力,我們總是采用最直截了當(dāng)?shù)姆椒ń鉀Q問(wèn)題,來(lái)不及多考慮這些方法的優(yōu)劣,即使明知將帶來(lái)更大的麻煩也必須如此。有些時(shí)候因?yàn)檫x擇了不恰當(dāng)?shù)脑O(shè)計(jì)模式,使原本簡(jiǎn)單的問(wèn)題變得復(fù)雜化。
??????? 總是有些優(yōu)秀的設(shè)計(jì)人員可以在同樣短的時(shí)間內(nèi)做出正確對(duì)待的判斷,他們同樣是依靠本能和直覺(jué),只是這種本能是在日常編程開(kāi)發(fā)中一點(diǎn)一滴積累起來(lái)的。如同一個(gè)劍客在危機(jī)時(shí)刻的一擊,并不是一時(shí)的靈光乍現(xiàn),而是平時(shí)刻苦修煉的結(jié)果。
??????? 俗話(huà)說(shuō),緊靠背棋譜成不了圍棋高手。只在概念上理解設(shè)計(jì)模式而不實(shí)現(xiàn),同樣成不了架構(gòu)設(shè)計(jì)師。在軟件設(shè)計(jì)時(shí),要有意識(shí)地問(wèn)自己使用還是不使用設(shè)計(jì)模式,不要匆忙下結(jié)論。重視軟件質(zhì)量的改進(jìn),如果有可能,則在項(xiàng)目后期重構(gòu)代碼。同時(shí)注意學(xué)習(xí)同行的經(jīng)驗(yàn),很多開(kāi)放源碼項(xiàng)目是值得學(xué)習(xí)的。
(1)正確理解設(shè)計(jì)模式
??????? 模式所關(guān)注的不僅是重復(fù)的解決方案,更主要的是關(guān)注重復(fù)出現(xiàn)的應(yīng)用場(chǎng)景和與場(chǎng)景相關(guān)的各種作用力。很多使用設(shè)計(jì)模式失敗的原因,并不是實(shí)現(xiàn)設(shè)計(jì)模式的方法有問(wèn)題,而是采用的設(shè)計(jì)模式不適合應(yīng)用場(chǎng)景。這往往導(dǎo)致設(shè)計(jì)過(guò)度,使軟件應(yīng)得復(fù)雜,進(jìn)而喪失對(duì)使用設(shè)計(jì)模式的信心。
(2)編程語(yǔ)言與設(shè)計(jì)模式的實(shí)現(xiàn)
?????????盡管設(shè)計(jì)模式本身并不要求一定用某種語(yǔ)言來(lái)實(shí)現(xiàn),但脫離了具體的實(shí)現(xiàn),就無(wú)法真正理解設(shè)計(jì)模式。GOF的《設(shè)計(jì)模式》是經(jīng)典之作,但畢竟距現(xiàn)在已經(jīng)十幾年了。這個(gè)期間開(kāi)發(fā)平臺(tái)已經(jīng)進(jìn)化了多代,很多新技術(shù)已經(jīng)應(yīng)用到編程中。有些技術(shù)可以簡(jiǎn)化設(shè)計(jì)模式的實(shí)現(xiàn),有些技術(shù)已經(jīng)采用了設(shè)計(jì)模式。因此,學(xué)習(xí)設(shè)計(jì)模式必須針對(duì)所使用的編程語(yǔ)言和開(kāi)發(fā)平臺(tái)。一定要注意,不是將《設(shè)計(jì)模式》中的例子轉(zhuǎn)換為C#或者其他語(yǔ)言就等于知道如何實(shí)現(xiàn)設(shè)計(jì)模式了,而是要關(guān)注設(shè)計(jì)模式的精髓,并結(jié)合具體的語(yǔ)言特點(diǎn)完成其實(shí)現(xiàn)。就.NET而言,很多技術(shù)可以簡(jiǎn)化設(shè)計(jì)模式的實(shí)現(xiàn),例如采用反射技術(shù)實(shí)現(xiàn)工廠(chǎng)和采用委托技術(shù)實(shí)現(xiàn)模板方法等。
(3)需求驅(qū)動(dòng)
??????? 需求驅(qū)動(dòng)不僅僅是功能性需求,還包括性能需求及運(yùn)行時(shí)的需求,如軟件的可維護(hù)性和可復(fù)用性等方面。
??????? 設(shè)計(jì)模式是針對(duì)軟件設(shè)計(jì)的,而軟件設(shè)計(jì)是針對(duì)需求的,一定不要為了使用模式而使用模式。在不合適的場(chǎng)合生搬硬套地使用模式反而會(huì)使設(shè)計(jì)應(yīng)得復(fù)雜,使軟件難以調(diào)試和維護(hù)。
???
(4)分析成功的模式應(yīng)用項(xiàng)目
??????? 對(duì)現(xiàn)有的應(yīng)用實(shí)例進(jìn)行分析是學(xué)習(xí)模式的一個(gè)很好的途徑,應(yīng)當(dāng)注意學(xué)習(xí)已有的項(xiàng)目不僅是學(xué)習(xí)設(shè)計(jì)模式如何實(shí)現(xiàn),更重要的是注意在什么場(chǎng)合使用設(shè)計(jì)模式。
??????? “置之死地而后生”可以說(shuō)是一種解決方案,而不是模式,或者說(shuō)僅僅給出了模式的實(shí)現(xiàn),而沒(méi)有交代使用的場(chǎng)合。項(xiàng)羽采用這個(gè)方案把秦軍打敗了,但馬謖卻丟了街亭。
(5)充分了解所使用的開(kāi)發(fā)平臺(tái)。
??????? 總的來(lái)說(shuō),設(shè)計(jì)模式是針對(duì)面向?qū)ο蟮能浖O(shè)計(jì)的,因此在理論上適合任何面向?qū)ο蟮恼Z(yǔ)言。但隨著技術(shù)的發(fā)展和編程環(huán)境的改善,設(shè)計(jì)模式的實(shí)現(xiàn)方式會(huì)有很大的差別。在某些平臺(tái)下,某些設(shè)計(jì)模式是自然實(shí)現(xiàn)的,某些模式已經(jīng)被平臺(tái)所實(shí)現(xiàn),某些模式存在的上下文已經(jīng)消失。
??????? 這里的平臺(tái)不僅指編程語(yǔ)言,還包括平臺(tái)引入的技術(shù)。.NET平臺(tái)引進(jìn)了反射、委托,以及屬性等新技術(shù),這些技術(shù)的使用使設(shè)計(jì)模式的實(shí)現(xiàn)方式有了很大的改變。例如,工廠(chǎng)方法通過(guò)采用反射技術(shù),可以將其中的子類(lèi)去掉。這實(shí)際上已經(jīng)是一個(gè).NET下的新模式,或者說(shuō)是.NET的“方言”。
(6)在編程中領(lǐng)悟模式
??????? 軟件開(kāi)發(fā)是一項(xiàng)實(shí)踐工作,最直接的方法就是編程。沒(méi)有定式很熟卻從來(lái)不下棋的圍棋高手,也沒(méi)有不會(huì)編程就成為架構(gòu)設(shè)計(jì)師的先例。對(duì)設(shè)計(jì)模式的掌握是水到渠成的事情,你可能是“頓悟”,也可能是“漸悟”,但前提是必須有相當(dāng)?shù)膶?shí)踐積累。當(dāng)然,并不是不需要看書(shū)學(xué)習(xí),但實(shí)踐仍然是必須首先要重視的。
??????? 認(rèn)為編程如同寫(xiě)文章,提高需要有一個(gè)過(guò)程。在多多編程的同時(shí),需要有一定的技巧。如果希望水平有較大提高,則需要對(duì)自己編寫(xiě)的代碼不斷重構(gòu)。力求最優(yōu)是個(gè)很好的習(xí)慣,當(dāng)然前提是項(xiàng)目進(jìn)度允許。即使項(xiàng)目時(shí)間緊張,也需要進(jìn)行適當(dāng)?shù)目偨Y(jié)。隔一段時(shí)間檢查一下以前的工作,會(huì)發(fā)現(xiàn)自己是否已經(jīng)有了提高。
(7)避免設(shè)計(jì)過(guò)度
??????? 設(shè)計(jì)模式解決的是設(shè)計(jì)不足的問(wèn)題,但同時(shí)也要避免設(shè)計(jì)過(guò)度。一定要牢記簡(jiǎn)潔原則(Keep It Simple, Stupid, KISS),要知道,設(shè)計(jì)模式是為了使設(shè)計(jì)簡(jiǎn)單,而不是更復(fù)雜。如果引入設(shè)計(jì)模式使設(shè)計(jì)變得復(fù)雜,只能說(shuō)我們把簡(jiǎn)單的問(wèn)題復(fù)雜化了,問(wèn)題本身不需要設(shè)計(jì)模式。
??????? 這里需要把握的是需求變化的程度,一定要區(qū)分需求的穩(wěn)定篇和可變篇。一個(gè)軟件必然有穩(wěn)定的篇,這個(gè)篇就是核心業(yè)務(wù)邏輯。如果核心業(yè)務(wù)邏輯發(fā)生變化,軟件就沒(méi)有存在的必要,這個(gè)篇的邏輯是我們需要固化的。對(duì)于可變的篇,需要判斷可能發(fā)生變化的程度來(lái)確定設(shè)計(jì)策略和設(shè)計(jì)風(fēng)險(xiǎn)。要知道,設(shè)計(jì)過(guò)度與設(shè)計(jì)不足同樣對(duì)項(xiàng)目有害。
(8)合理看待設(shè)計(jì)模式的實(shí)現(xiàn)實(shí)例
??????? 現(xiàn)在,從各種途徑可以發(fā)現(xiàn)各種設(shè)計(jì)模式的實(shí)現(xiàn)實(shí)例。需要說(shuō)明的是,其中很多實(shí)例所說(shuō)明的僅僅是設(shè)計(jì)模式的解決方案的實(shí)現(xiàn),并沒(méi)有分析模式使用的上下文。實(shí)際上,這也是最困難的篇——從而導(dǎo)致實(shí)例中的設(shè)計(jì)模式使用從實(shí)踐的角度看,往往是過(guò)度設(shè)計(jì),也就是有小題大做的嫌疑。
??????? 對(duì)模式感興趣的朋友可以從下面的幾個(gè)開(kāi)源項(xiàng)目中學(xué)習(xí)模式的成功應(yīng)用。以后可能會(huì)把模式在下面幾個(gè)開(kāi)源代碼中的應(yīng)用的文章與大家共享。
??????????????????????????? NUnit:.net:單元測(cè)試平臺(tái),采用c#編寫(xiě)
??????????????????????????? DotNetNoke:vb.net寫(xiě)的Portal Web
??????????????????????????? Gentle:對(duì)象持久化工具,采用C#
??????????????????????????? Log4net:日志記錄工具,采用C#
??????? 總是有些優(yōu)秀的設(shè)計(jì)人員可以在同樣短的時(shí)間內(nèi)做出正確對(duì)待的判斷,他們同樣是依靠本能和直覺(jué),只是這種本能是在日常編程開(kāi)發(fā)中一點(diǎn)一滴積累起來(lái)的。如同一個(gè)劍客在危機(jī)時(shí)刻的一擊,并不是一時(shí)的靈光乍現(xiàn),而是平時(shí)刻苦修煉的結(jié)果。
??????? 俗話(huà)說(shuō),緊靠背棋譜成不了圍棋高手。只在概念上理解設(shè)計(jì)模式而不實(shí)現(xiàn),同樣成不了架構(gòu)設(shè)計(jì)師。在軟件設(shè)計(jì)時(shí),要有意識(shí)地問(wèn)自己使用還是不使用設(shè)計(jì)模式,不要匆忙下結(jié)論。重視軟件質(zhì)量的改進(jìn),如果有可能,則在項(xiàng)目后期重構(gòu)代碼。同時(shí)注意學(xué)習(xí)同行的經(jīng)驗(yàn),很多開(kāi)放源碼項(xiàng)目是值得學(xué)習(xí)的。
(1)正確理解設(shè)計(jì)模式
??????? 模式所關(guān)注的不僅是重復(fù)的解決方案,更主要的是關(guān)注重復(fù)出現(xiàn)的應(yīng)用場(chǎng)景和與場(chǎng)景相關(guān)的各種作用力。很多使用設(shè)計(jì)模式失敗的原因,并不是實(shí)現(xiàn)設(shè)計(jì)模式的方法有問(wèn)題,而是采用的設(shè)計(jì)模式不適合應(yīng)用場(chǎng)景。這往往導(dǎo)致設(shè)計(jì)過(guò)度,使軟件應(yīng)得復(fù)雜,進(jìn)而喪失對(duì)使用設(shè)計(jì)模式的信心。
(2)編程語(yǔ)言與設(shè)計(jì)模式的實(shí)現(xiàn)
?????????盡管設(shè)計(jì)模式本身并不要求一定用某種語(yǔ)言來(lái)實(shí)現(xiàn),但脫離了具體的實(shí)現(xiàn),就無(wú)法真正理解設(shè)計(jì)模式。GOF的《設(shè)計(jì)模式》是經(jīng)典之作,但畢竟距現(xiàn)在已經(jīng)十幾年了。這個(gè)期間開(kāi)發(fā)平臺(tái)已經(jīng)進(jìn)化了多代,很多新技術(shù)已經(jīng)應(yīng)用到編程中。有些技術(shù)可以簡(jiǎn)化設(shè)計(jì)模式的實(shí)現(xiàn),有些技術(shù)已經(jīng)采用了設(shè)計(jì)模式。因此,學(xué)習(xí)設(shè)計(jì)模式必須針對(duì)所使用的編程語(yǔ)言和開(kāi)發(fā)平臺(tái)。一定要注意,不是將《設(shè)計(jì)模式》中的例子轉(zhuǎn)換為C#或者其他語(yǔ)言就等于知道如何實(shí)現(xiàn)設(shè)計(jì)模式了,而是要關(guān)注設(shè)計(jì)模式的精髓,并結(jié)合具體的語(yǔ)言特點(diǎn)完成其實(shí)現(xiàn)。就.NET而言,很多技術(shù)可以簡(jiǎn)化設(shè)計(jì)模式的實(shí)現(xiàn),例如采用反射技術(shù)實(shí)現(xiàn)工廠(chǎng)和采用委托技術(shù)實(shí)現(xiàn)模板方法等。
(3)需求驅(qū)動(dòng)
??????? 需求驅(qū)動(dòng)不僅僅是功能性需求,還包括性能需求及運(yùn)行時(shí)的需求,如軟件的可維護(hù)性和可復(fù)用性等方面。
??????? 設(shè)計(jì)模式是針對(duì)軟件設(shè)計(jì)的,而軟件設(shè)計(jì)是針對(duì)需求的,一定不要為了使用模式而使用模式。在不合適的場(chǎng)合生搬硬套地使用模式反而會(huì)使設(shè)計(jì)應(yīng)得復(fù)雜,使軟件難以調(diào)試和維護(hù)。
???
(4)分析成功的模式應(yīng)用項(xiàng)目
??????? 對(duì)現(xiàn)有的應(yīng)用實(shí)例進(jìn)行分析是學(xué)習(xí)模式的一個(gè)很好的途徑,應(yīng)當(dāng)注意學(xué)習(xí)已有的項(xiàng)目不僅是學(xué)習(xí)設(shè)計(jì)模式如何實(shí)現(xiàn),更重要的是注意在什么場(chǎng)合使用設(shè)計(jì)模式。
??????? “置之死地而后生”可以說(shuō)是一種解決方案,而不是模式,或者說(shuō)僅僅給出了模式的實(shí)現(xiàn),而沒(méi)有交代使用的場(chǎng)合。項(xiàng)羽采用這個(gè)方案把秦軍打敗了,但馬謖卻丟了街亭。
(5)充分了解所使用的開(kāi)發(fā)平臺(tái)。
??????? 總的來(lái)說(shuō),設(shè)計(jì)模式是針對(duì)面向?qū)ο蟮能浖O(shè)計(jì)的,因此在理論上適合任何面向?qū)ο蟮恼Z(yǔ)言。但隨著技術(shù)的發(fā)展和編程環(huán)境的改善,設(shè)計(jì)模式的實(shí)現(xiàn)方式會(huì)有很大的差別。在某些平臺(tái)下,某些設(shè)計(jì)模式是自然實(shí)現(xiàn)的,某些模式已經(jīng)被平臺(tái)所實(shí)現(xiàn),某些模式存在的上下文已經(jīng)消失。
??????? 這里的平臺(tái)不僅指編程語(yǔ)言,還包括平臺(tái)引入的技術(shù)。.NET平臺(tái)引進(jìn)了反射、委托,以及屬性等新技術(shù),這些技術(shù)的使用使設(shè)計(jì)模式的實(shí)現(xiàn)方式有了很大的改變。例如,工廠(chǎng)方法通過(guò)采用反射技術(shù),可以將其中的子類(lèi)去掉。這實(shí)際上已經(jīng)是一個(gè).NET下的新模式,或者說(shuō)是.NET的“方言”。
(6)在編程中領(lǐng)悟模式
??????? 軟件開(kāi)發(fā)是一項(xiàng)實(shí)踐工作,最直接的方法就是編程。沒(méi)有定式很熟卻從來(lái)不下棋的圍棋高手,也沒(méi)有不會(huì)編程就成為架構(gòu)設(shè)計(jì)師的先例。對(duì)設(shè)計(jì)模式的掌握是水到渠成的事情,你可能是“頓悟”,也可能是“漸悟”,但前提是必須有相當(dāng)?shù)膶?shí)踐積累。當(dāng)然,并不是不需要看書(shū)學(xué)習(xí),但實(shí)踐仍然是必須首先要重視的。
??????? 認(rèn)為編程如同寫(xiě)文章,提高需要有一個(gè)過(guò)程。在多多編程的同時(shí),需要有一定的技巧。如果希望水平有較大提高,則需要對(duì)自己編寫(xiě)的代碼不斷重構(gòu)。力求最優(yōu)是個(gè)很好的習(xí)慣,當(dāng)然前提是項(xiàng)目進(jìn)度允許。即使項(xiàng)目時(shí)間緊張,也需要進(jìn)行適當(dāng)?shù)目偨Y(jié)。隔一段時(shí)間檢查一下以前的工作,會(huì)發(fā)現(xiàn)自己是否已經(jīng)有了提高。
(7)避免設(shè)計(jì)過(guò)度
??????? 設(shè)計(jì)模式解決的是設(shè)計(jì)不足的問(wèn)題,但同時(shí)也要避免設(shè)計(jì)過(guò)度。一定要牢記簡(jiǎn)潔原則(Keep It Simple, Stupid, KISS),要知道,設(shè)計(jì)模式是為了使設(shè)計(jì)簡(jiǎn)單,而不是更復(fù)雜。如果引入設(shè)計(jì)模式使設(shè)計(jì)變得復(fù)雜,只能說(shuō)我們把簡(jiǎn)單的問(wèn)題復(fù)雜化了,問(wèn)題本身不需要設(shè)計(jì)模式。
??????? 這里需要把握的是需求變化的程度,一定要區(qū)分需求的穩(wěn)定篇和可變篇。一個(gè)軟件必然有穩(wěn)定的篇,這個(gè)篇就是核心業(yè)務(wù)邏輯。如果核心業(yè)務(wù)邏輯發(fā)生變化,軟件就沒(méi)有存在的必要,這個(gè)篇的邏輯是我們需要固化的。對(duì)于可變的篇,需要判斷可能發(fā)生變化的程度來(lái)確定設(shè)計(jì)策略和設(shè)計(jì)風(fēng)險(xiǎn)。要知道,設(shè)計(jì)過(guò)度與設(shè)計(jì)不足同樣對(duì)項(xiàng)目有害。
(8)合理看待設(shè)計(jì)模式的實(shí)現(xiàn)實(shí)例
??????? 現(xiàn)在,從各種途徑可以發(fā)現(xiàn)各種設(shè)計(jì)模式的實(shí)現(xiàn)實(shí)例。需要說(shuō)明的是,其中很多實(shí)例所說(shuō)明的僅僅是設(shè)計(jì)模式的解決方案的實(shí)現(xiàn),并沒(méi)有分析模式使用的上下文。實(shí)際上,這也是最困難的篇——從而導(dǎo)致實(shí)例中的設(shè)計(jì)模式使用從實(shí)踐的角度看,往往是過(guò)度設(shè)計(jì),也就是有小題大做的嫌疑。
??????? 對(duì)模式感興趣的朋友可以從下面的幾個(gè)開(kāi)源項(xiàng)目中學(xué)習(xí)模式的成功應(yīng)用。以后可能會(huì)把模式在下面幾個(gè)開(kāi)源代碼中的應(yīng)用的文章與大家共享。
??????????????????????????? NUnit:.net:單元測(cè)試平臺(tái),采用c#編寫(xiě)
??????????????????????????? DotNetNoke:vb.net寫(xiě)的Portal Web
??????????????????????????? Gentle:對(duì)象持久化工具,采用C#
??????????????????????????? Log4net:日志記錄工具,采用C#
總結(jié)
以上是生活随笔為你收集整理的如何掌握并在实践中自如运用设计模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 面向对象葵花宝典:思想、技巧与实践(36
- 下一篇: 关于面向对象的的设计原则的使用