好的系統設計追求如下特性:
l 可擴充性( Extensibility ):新的功能或特性很容易加入到系統中來;
l 靈活性( Flexibility ):可以允許代碼修改平穩發生,對一處的修改不會波及到很多其他模組;
l 可插入性( Pluggability ):可以很容易地將一個類或組件抽出去,同時將另一個有相同介面的類 / 介面加入進來。
具有如上特性的系統才有真正的可維護性和可複用性。而可維護性和可複用性對一個持
續接入新需求,現有功能逐步完善,新功能不斷豐富,版本不會終止的大型軟體產品來說至關重要。
傳統的複用包括:代碼的 copy 複用,演算法的複用,資料結構的複用。
在 物件導向領域,資料的抽象化、封裝、繼承和多態性是幾項最重要的語言特性,這些特性使得一個系統可以在更高的層次上提供可複用性。資料的抽象化和繼承關係 使得概念和定義可以複用;多態性使得實現和應用可以複用;而抽象化和封裝可以保持和促進系統的可維護性。這樣,複用的焦點不再集中在函數和演算法等具體實現 細節上,而是集中在最重要的宏觀的商務邏輯的抽象層次上。複用焦點的倒轉不是因為實現細節的複用不再重要,而是因為這些細節上的複用往往已經做的很好(例 如,很容易找到並應用成熟的資料結構類庫等),而真正衝擊系統的是其要實現業務的千變萬化。
本 質上說,如果說一個軟體的需求是永不變更或發展的,該軟體也就不需要任何設計,怎麼編碼實現都行,只要需求滿足,效能達標。但事實上,軟體的本性就是不斷 增強,不斷拓展的,不斷變化的。我們可以控制指尖流淌出的每行代碼,但控制不了奉為上帝的使用者的需求。編碼結束,測試全部通過,使用者在試用過程中才發現原 來的需求有問題,需要變更或提出新需求,怎麼辦?向使用者抗議:需求總在變,沒法做!?平抑心中的抱怨,加班加點大量的修改代碼,瘋狂的測試,依然是時間緊 迫,心中沒底?抑或瞭然於胸:這個變更或小需求合理,系統很方便納入;於是坦然地和使用者協商下一個交付時間點?
要使系統最大程度的適應需求的變更或新增,就必須在其要實現的宏觀商務邏輯的抽象複用上下功夫。而設計模式就是綜合運用物件導向技術和特性來提高商務邏輯可複用性的常用方法和經驗的提取和匯總。
掌握 23 種 設計模式的關鍵是理解它們的共通目的:使所設計的軟體系統在一般或特定(系統將來在特定點上擴充的可能性大)情境下,儘可能的對擴充開放,對修改關閉。即 面對新需求或需求變更時,容易開發獨立於既有代碼的新代碼接入到現有系統或對現有代碼做可控的少量修改,而不是在現有代碼基礎上做大量的增、刪、改。為了 這一目的, 23 種設計模式貫穿了物件導向編程的基本原則:
l 面向介面或抽象編程,而不是面向實現編程。
l 一個對象應當對其他對象有儘可能少的瞭解,即松耦合。
l 純粹的功能複用時,盡量不要使用繼承,而是使用組合。使已有的對象成為新對象的一部分;新的對象通過向這些對象的委派達到複用已有功能的目的。