Java設計模式——模式與軟件設計

一、模式是什麼

        人們在自己的環境中不斷髮現問題和尋找問題的解決方案的時候,發現有一些問題及其解決方案不斷變化面孔重複出現,但在這些不同的面孔後面有着共同的本質,這些共同的本質就是模式。模式化的過程是把問題抽象化,在忽略掉不重要的細節後,發現問題的一般性本質,並找到普遍適用的解決問題的過程。

二、軟件的可維護性和可複用性

1.二者的關係

通常認爲,一個易於維護的系統,就是複用率較高的系統;而一個複用性較好的系統,就是一個易於維護的系統。但實際上,可維護性和可複用性是兩個獨立的目標,並不總是方向一致的。對於面向對象的軟件系統設計來說,在支持可維護性(Maintainability)的同時,提供系統的可複用性(Reuseability)是一個核心問題。

設計原則是在提高一個系統的可維護性的同時,提高這個系統的可複用性的指導原則,依照這些設計原則進行系統設計,就可以同時做到軟件的可維護性和可複用性。

2.軟件系統的可維護性

軟件的維護就是軟件的再生。一個好的軟件設計,必須能夠允許新的設計要求以較爲容易和平穩的方式加入到自己的系統中去。一個可維護性較好的系統,應當能夠允許維護工作能夠以容易、準確、安全和經濟的形式進行。

導致一個軟件設計的可維護性較低,也就是說會隨着性能要求的變化而“腐爛”的真正原因有四個:過於僵硬(Rigidity),過於脆弱(Fragility),複用率低(Immobility),黏度過高(Viscosity)。

過於僵硬

很難再一個軟件系統中加入一個新的性能,哪怕是一個很小的都很難。這是因爲加入一個新性能,不僅僅意味着建造一個獨立的新模塊,而且因爲這個新性能會波及很多其他模塊,最後變成跨越幾個模塊的改動。

過於脆弱

軟件系統在修改已有代碼時過於脆弱。對一個地方的修改,往往會導致看上去沒有關係的另一個地方發生故障。

複用率低

所謂複用,是指一個軟件的組成部分,可以再同一個項目的不同地方甚至另一個項目中重複使用。每當程序員發現一段代碼、函數、模塊所做的事情可以在新的模塊、或新系統中使用的時候,他們總是發現,這些已有的代碼依賴於一大堆其他的東西,以至於很難將它們分開。最後,他們發現最好的辦法就是不去“碰”這些已有的東西,而是重新寫自己的代碼。

黏度過高

有的時候,一個改動可以以保存原始設計意圖和原始設計框架的方式進行,也可以以破壞原始意圖和原始框架的方式進行。第一種辦法無疑會對系統的未來有利,第二種辦法無疑是權宜之計,可以解決短期問題,但是會犧牲中長期的利益。

一個系統設計,如果總是使得第二種辦法比第一種辦法容易,就叫做黏度過高。

3.系統的可複用性

(1)複用的重要性

軟件複用的好處有:第一,較高的生產效率;第二,較高的軟件質量;第三,恰當的使用複用可以改善系統的可維護性。

(2)面向對象設計的複用

在像Java這樣面向對象的語言中,數據的抽象化、繼承、封裝和多態性是幾項最重要的語言特性,這些特性可以使得一個系統可以在更高的層次上提供可複用性。

數據的抽象化和繼承關係使得概念和定義可以複用。

多態性使得實現和應用可以複用。

抽象化和封裝可以保持和促進系統的可維護性。

這樣一來,複用的焦點不再集中在函數和算法等具體實現細節上,而是集中在最重要的含有宏觀商業邏輯的抽象層次上。抽象層次是在提高複用性的同時保持和提供可維護性的關鍵。抽象層次應當是較爲穩定的,是複用的重點。如果抽象層次的模塊相對地獨立於具體層次的模塊的話,那麼具體層次內部的變化就不會影響到抽象層次的結構,所以抽象層次的模塊複用就會較爲容易。

在面向對象的設計裏面,可維護性複用是以設計原則和設計模式爲基礎的。

(3)對可維護性的支持

三個設計目標:可擴展性(Extensibility),靈活性(Flexibility)、可插入性(Pluggability)。

可擴展性:新的性能可以很容易的加入到系統中去。

恰當地提高系統的可複用性,可以提高系統的擴展性。允許一個具有同樣接口的新的類代替舊有的類,是對接口的複用。客戶端依賴於一個抽象的接口,而不是一個具體的實現類,使得這個具體類可以被另一個具體類所取代,而不影響到客戶端。

系統的可擴展性是由“開-閉”原則里氏代換原則依賴倒轉原則組合/聚合複用原則所保證的。

 

靈活性:可以允許代碼修改平穩的發生,而不會波及到很多其他的模塊。

恰當地提高系統的可複用性,可以提高系統的靈活性。在一個設計得當的系統中,每一個模塊都相對於其他模塊獨立存在,並保持與其他模塊儘可能少的通信。這樣一來,在其中一個模塊發生代碼修改的時候,這個修改的壓力不會傳遞到其他的模塊。

系統的靈活性是由“開-閉”原則迪米特法則接口隔離原則所保證的。

 

可插入性:可以很容易的將一個類抽出去,同時將另一個有同樣接口的類插入進來。

恰當地提高系統的可複用性,可以提高系統的可插入性。在一個符合“開-閉”原則的系統中,抽象層封裝了與商業邏輯有關的重要行爲,這些行爲的具體實現由實現層給出。當一個實現類不再滿足需要,需要以另一個實現類取代的時候,系統的設計可以保證舊的類被“拔出”,新的類被“插入”。

系統的可插入性是由“開-閉”原則里氏代換原則組合/聚合複用原則以及依賴倒轉原則所保證。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章