- 相關(guān)推薦
淺談設計模式及如何選擇設計模式
摘 要:針對當前軟件行業(yè)普遍借鑒的設計模式,提出了如何選擇設計模式,討論了設計原則。
關(guān)鍵詞:設計模式;設計原則;設計模式的選擇
設計模式是面向對象技術(shù)的最新進(jìn)展之一,它針對不斷重復出現的問(wèn)題,能夠復用已有的、優(yōu)秀的解決方案,因此提高了軟件開(kāi)發(fā)質(zhì)量和代碼重用性。
1、設計模式概念
設計模式是“對一些經(jīng)過(guò)定制、能相互通信的對象和類(lèi)的描述,用來(lái)解決特定場(chǎng)景下某個(gè)普遍的設計問(wèn)題!盙OF經(jīng)典設計模式使用類(lèi)圖、對象圖、交互圖等顯示類(lèi)與對象之間的關(guān)系和通信。其中類(lèi)圖用來(lái)描述各個(gè)類(lèi)、類(lèi)的結構以及它們之間的關(guān)系,對象圖描述對象結構,而交互圖描述的是對象間產(chǎn)生關(guān)系的流程。
設計模式種類(lèi)眾多,在GOF經(jīng)典設計模式中,達23種之多,設計模式分類(lèi)主要是根據目的準則和范圍準則。目的準則說(shuō)明模式是用來(lái)完成什么工作的,根據目的準則,模式可分為三種:(1)創(chuàng )建型:設計模式與對象創(chuàng )建無(wú)關(guān),把對象的創(chuàng )建和其它部分的代碼分離,從而創(chuàng )建對象會(huì )更加靈活。例如設計模式中的簡(jiǎn)單工廠(chǎng)模式,工廠(chǎng)方法模式,抽象工廠(chǎng)模式,創(chuàng )建者模式,原型模式,單例模式;(2)結構型:模式結構清晰,主要處理類(lèi)或對象的組合,但是模式的每一部分的結構都專(zhuān)門(mén)負責完成某一職責。例如設計模式中的外觀(guān)模式,適配器模式,代理模式,裝飾模式,橋模式,組合模式,享元模式;(3)行為型:行為類(lèi)模式主要描述類(lèi)或對象之間的交互,以及類(lèi)和對象的主要職責模板方法模式,觀(guān)察者模式,狀態(tài)模式,策略模式,職責鏈模式,命令模式,訪(fǎng)問(wèn)者模式,調停者模式,備忘錄模式,迭代器模式,解釋器模式。范圍準則關(guān)注模式的制定主要用于類(lèi)還是對象,其中“類(lèi)模式”處理類(lèi)與類(lèi)之間的繼承關(guān)系,這種關(guān)系是靜態(tài)的,而“對象模式”處理對象之間的關(guān)系,這種關(guān)系是動(dòng)態(tài)的。設計模式種類(lèi)繁多,如何選出一個(gè)針對特定設計問(wèn)題的模式是十分困難的。因此選擇適合特定設計問(wèn)題的設計模式,是人們比較關(guān)心的問(wèn)題。
2、設計模式的選擇
設計模式是面向對象的高層次解決方案,它不會(huì )過(guò)于關(guān)注具體問(wèn)題的細節,所以應該把現實(shí)世界中存在的問(wèn)題進(jìn)行抽象,設計模式在選擇對象和決定對象粒度方面都能起到作用。
、胚x擇合適的對象。設計模式的對象來(lái)源于現實(shí)世界的抽象模型,針對具體問(wèn)題描述,進(jìn)行抽象,創(chuàng )建類(lèi)和操作。但是在這些分析模型中得到的一些層次較高或較低的類(lèi),在現實(shí)世界里并不存在,比如數組等,設計模式能夠確定這些在現實(shí)世界中找不到的類(lèi)。
、茮Q定對象粒度大小。設計模式能夠決定對象的大小和數目,例如,外觀(guān)模式能夠使用對象表示完整的子系統,享元模式的對象粒度最小且數目眾多,抽象工廠(chǎng)模式能夠生產(chǎn)其它對象的對象。這些設計模式為對象粒度的選擇提供了一定的依據。每一種設計模式都是為解決一類(lèi)問(wèn)題而出現的,例如:橋接(Bridge)模式屬于結構性模式,其意圖是分離抽象部分和實(shí)現部分,使這兩部分相互獨立,不會(huì )相互影響;解釋器(Interpreter)模式屬于行為模式,它的意圖是給定一個(gè)語(yǔ)言及其語(yǔ)法語(yǔ)義,并定義一個(gè)解釋器,用來(lái)使用這些語(yǔ)法語(yǔ)義表示這個(gè)語(yǔ)言的含義;生成器(Builder)模式屬于創(chuàng )建型模式,它的意圖是把復雜對象的構建和它的表示分開(kāi),使得同一個(gè)創(chuàng )建過(guò)程可以含有不同的表示。只有了解了設計模式的意圖,才會(huì )比較容易地選擇出,適合實(shí)際問(wèn)題的一個(gè)或多個(gè)設計模式。
盡管設計模式在粒度和抽象層次上各不相同,但是它們之間還是具有一些關(guān)聯(lián),根據目的和使用范圍不同,對設計模式進(jìn)行了分類(lèi)。分類(lèi)能夠指導應用設計模式的目的和范圍,目的準則中的創(chuàng )建型模式與對象的創(chuàng )建有關(guān),結構性模式關(guān)注于類(lèi)或者對象的組合,行為性模式描述了類(lèi)或者對象的交互關(guān)系和職責分配,范圍準則是以類(lèi)和對象來(lái)劃分的,類(lèi)模式是研究類(lèi)與子類(lèi)之間的靜態(tài)關(guān)系,而對象模式關(guān)注的是對象之間的動(dòng)態(tài)關(guān)系。如果確定了業(yè)務(wù)邏輯的目的和元素,就能縮小設計模式的選擇范圍,能夠快速獲得適合的設計模式或者模式組。
3、設計原則
、艈我宦氊熢瓌t,即不能存在多于一個(gè)導致類(lèi)變更的原因。簡(jiǎn)單的說(shuō)就是一個(gè)類(lèi)只負責一項職責。在軟件設計中,秉承著(zhù)“高內聚,低耦合”的思想,讓一個(gè)類(lèi)僅負責一項職責。
、评锸咸鎿Q原則,如果對每一個(gè)類(lèi)型為T(mén)1的對象o1,都有類(lèi)型為T(mén)2的對象o2,使得以T1定義的所有程序P在所有的對象o1都換成o2時(shí),程序P的行為沒(méi)有變化,那么類(lèi)型T2是類(lèi)型T1的子類(lèi)型。包含4層含義:①子類(lèi)可以實(shí)現父類(lèi)的抽象方法,但是不能覆蓋父類(lèi)的非抽象方法。②子類(lèi)可以實(shí)現父類(lèi)的抽象方法,但是不能覆蓋父類(lèi)的非抽象方法。③當子類(lèi)覆蓋或實(shí)現父類(lèi)的方法時(shí),方法的前置條件(即方法的形參)要比父類(lèi)方法的輸入參數更寬松。④當子類(lèi)覆蓋或實(shí)現父類(lèi)的方法時(shí),方法的前置條件(即方法的形參)要比父類(lèi)方法的輸入參數更寬松。
、且蕾(lài)倒置原則,高層模塊不應該依賴(lài)低層模塊,兩者都應該依賴(lài)其抽象,抽象不應該依賴(lài)細節,細節應該依賴(lài)抽象。
、冉涌诟綦x原則,接口中的方法應該盡量少,不要使接口過(guò)于臃腫,不要有很多不相關(guān)的邏輯方法。
總之,原則是前人經(jīng)驗的總結,在軟件設計中具有一定的指導作用,但是不能完全照搬這些原則。對于接口隔離原則來(lái)說(shuō),接口盡量小,但是也要有限度。對接口進(jìn)行細化可以提高程序設計靈活性是不爭的事實(shí),但是如果過(guò)小,則會(huì )造成接口數量過(guò)多,使設計復雜化,所以一定要適度。
【淺談設計模式及如何選擇設計模式】相關(guān)文章:
審計模式的比較與選擇08-10
淺談我國汽車(chē)營(yíng)銷(xiāo)模式08-18
企業(yè)并購重組的模式選擇08-06
基于顧客價(jià)值的盈利模式設計06-20
淺談門(mén)診藥房的管理模式09-24