Java設計模式1:設計模式概論

五月的倉頡發表於2015-10-20

設計模式是什麼

設計模式(Design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、程式碼設計經驗的總結。使用設計模式是為了可重用程式碼、讓程式碼更容易地被他人理解、保證程式碼可靠性。毫無疑問,設計模式於己於人於系統都是多贏的,設計模式使程式碼編制真正工程化,設計模式是軟體工程的基石脈絡,如同大廈的結構一樣。

總體來說,設計模式分為3大類總共23種:

1、建立型模式,共5種

工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式

2、結構型模式,共7種

介面卡模式、裝飾器模式、外觀模式、橋接模式、組合模式、享元模式

3、行為型模式,共11種

策略模式、模板方法模式、觀察者模式、迭代器模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式

其實還有兩類,即併發性模式和執行緒池模式。設計模式的模組不會每一種設計模式都講解,而是挑選一些重要的,常用的設計模式進行講解,重質不重量。

 

設計模式六大原則

1、開閉原則OCP

開閉原則說的是,對擴充套件開放、對修改關閉。在程式需要進行擴充套件的時候,不能去修改原有的程式碼,這也是為了使程式的擴充套件性更好、易於升級和維護。

2、里氏代換原則LSP

在軟體中將一個基類物件替換成它的子類物件,程式將不會產生任何錯誤和異常,反過來則不成立。如果一個軟體實體使用的是一個子類物件的話,那麼它一定不能夠使用基類物件。里氏代換原則的程式表現就是:在程式中儘量使用基類型別來對物件進行定義,而在執行時再確定其子類型別,用子類物件來替換父類。

3、控制反轉原則IOC

針對介面程式設計,依賴於抽象而不依賴於具體

4、介面隔離原則ISP

使用多個隔離的介面,比使用單個介面要好

5、迪米特法則DP

一個實體應當儘量少地與其他實體間發生相互作用,使得系統功能模組相對獨立

6、合成複用原則

儘量使用組合/聚合的方式,而不是使用繼承

 

設計中的三個關鍵字

1、抽象化

在眾多事物中提取出共同的、本質性的特徵,捨棄非本質的特徵,就是抽象化。抽象化的過程也是一個剪裁的過程,在抽象時,同於不同,取決於從什麼角度上來抽象。抽象的角度取決於分析問題的目的。

2、實現化

抽象類給出的具體實現,就是實現化。

一個類的例項就是這個類的例項化,一個具體子類是它的抽象超類的例項化。

3、解耦

這就比較重要了,平時我們老說好的程式碼應該是"高內聚、低耦合",那麼什麼是耦合呢?

所謂耦合,就是兩個實體的行為的某種強關聯。而將它們之間的強關聯去掉,就是解耦。解耦是指將抽象化和實現化之間的耦合解開,或者說是將它們之間的強關聯改換成弱關聯。

所謂強關聯,指的是在編譯時期已經確定的,無法在執行時期動態改變的關聯;所謂弱關聯,就是可以動態地確定並且在執行時期動態改變的關聯。從這個定義看,繼承關係是強關聯,聚合關係是弱關聯。

 

MVC設計模式

MVC設計模式不屬於23種設計模式之一,至於為什麼後面會講,但是因為這個非常常見、比較重要,就講一下。

MVC全名是Model View Controller,是模型(Model)-檢視(View)-控制器(Controller)的縮寫,一種軟體設計典範。MVC用一種業務邏輯、資料、介面顯示分離的方法組織程式碼,將業務邏輯聚集到一個不見裡面,在改進和個性化定製介面及使用者互動的同時,不需要重新編寫業務邏輯。

MVC設計模式同時也提供了對HTML、CSS、JS的完全控制,接下來看一下MVC設計模式中的幾個部分:

1、模型Model

模型標識企業資料和業務規則,在MVC的三個部件中,模型擁有最多的處理任務。被模型返回的資料是中立的,也就是說模型與資料格式無關,這樣一個模型能為多個檢視提供資料,由於應用於模型的程式碼只需寫一次就可以被多個檢視重用,所以減少了程式碼的重複性

2、檢視View

檢視是使用者看到並與之互動的介面。對老式的Web應用程式而言,檢視就是HTML元素組成的介面,在新式的Web應用程式中,HTML依舊在檢視中扮演者重要的角色,但是一些新的技術已經層出不窮,包括XHTML、XML/XSL、WML等一些標識語言和Web Service。

MVC的好處是它能為應用程式處理很多不同的檢視,在檢視中其實沒有真正發生處理,檢視只是作為一種輸出資料並允許使用者操縱的方式

3、控制器Controller

控制器接受使用者的輸入並呼叫模型和檢視去完成使用者的需求,所以當單機Web頁面中的超連結和傳送HTML表單時,控制器本身不輸出任何東西和做任何處理,它只是接收請求並決定呼叫哪個模型構件去處理請求,然後再確定用哪個檢視來顯示返回的資料

使用MVC分層模型有助於管理複雜的應用程式,因為開發者在一個時間內可以專門關注某一個方面。例如,開發者可以在不依賴業務邏輯的情況下專注於檢視設計,同時也讓應用程式的測試更加容易。

使用MVC分層模型也簡化了分組開發,不同的開發人員可以同時開發檢視、控制器邏輯和業務邏輯。

最典型的MVC就是JSP+servlet+javabean

 

為什麼MVC設計模式不屬於23種設計模式之一

從兩個角度看這個問題:

1、MVC設計模式我們這麼叫,那麼MVC到底是不是一種設計模式?或者說MVC是一種框架?框架與設計模式雖然相似,但卻有著根本的不同。設計模式是對在某種環境中反覆出現的問題以及解決該問題的方案的描述,它比框架更抽象;框架可以用程式碼表示,也能直接執行或複用,而對設計模式而言只有例項才能用程式碼表示,設計模式是比框架更小的元素。一個框架中往往含有一個或者多個設計模式,框架總是針對某一特定應用領域,但同一設計模式卻可以適用於各種應用。可以說,框架是軟體,設計模式是軟體的知識;框架是大智慧,用來對軟體設計進行分工;設計模式是小技巧,對具體問題提出解決方案,以提高程式碼複用率,降低耦合度。從這個角度講,MVC應屬於一種框架,而不是一種設計模式

2、第一點說了,"一個框架中往往含有一個或者多個設計模式",實際上也確實如此。《GOF》,即《設計模式》一書的作者並沒有把MVC提及為一種設計模式,在他們看來,MVC其實是其它三個景點的設計模式的演變:觀察者模式+策略模式+組合模式,根據MVC在框架中不同的實現可能還會用到工廠模式和裝飾器模式。比方說,model是應用的資料,view處理螢幕上展現給使用者的內容,為此,MVC在核心通訊上基於推送/訂閱模型,當一個model變化時它對應用其他模組發出更新通知,訂閱者----通常是一個controller然後更新對應的view,這種自然的觀察關係促進了多個view關聯到同一個model。

 

相關文章