目錄
設計模式概述
GoF四人幫提出了設計模式的概念.
模式:模式是在特定環境下人們解決某類重複出現問題的一套成功或有效的解決方案.
軟件模式:軟件模式即軟件開發的總體指導思路或參照樣板;軟件模式並非僅限於設計模式,還包括架構模式,分析模式和過程模式等.
軟件模式的基本結構:問題描述,前提條件(環境或約束條件),解法和效果.
設計模式:設計模式是在特定環境下爲解決某一通用軟件設計問題提供的一套定製的解決方案,該方案描述了對象和類之間的相互作用.
設計模式的基本要素:模式名稱,問題,目的,解決方案,效果,實例代碼和相關設計模式.
設計模式的分類
- 根據目的分類
- 根據範圍(即模式主要用於處理類之間的關係還是處理對象之間的關係)分類
根據模式的目的,可分爲:
- 創建型模式,主要用於創建對象,GoF提供了5種.
- 結構型模式,主要用於處理類或對象的組合,GoF提供了7種.
- 行爲型模式,主要用於描述類或對象怎樣交互和怎樣分配職責,GoF提供了11種.
根據模式的範圍,可分爲:
- 類模式,處理類和子類之間的關係.關係編譯時確定,是一種靜態關係.
- 對象模式,處理對象之間的關係,關係在運行時變化,更具動態性.
GoF的23種模式一覽表
範圍/目的 | 創建型模式 | 結構型模式 | 行爲型模式 |
---|---|---|---|
類模式 | 工廠方法模式 | (類)適配器模式 |
解釋器模式 模板方法模式 |
對象模式 |
抽象工廠模式 建造者模式 原型模式 單例模式 |
(對象)適配器模式 橋接模式 組合模式 裝飾模式 外觀模式 享元模式 代理模式 |
職責鏈模式 命令模式 迭代器模式 中介者模式 備忘錄模式 觀察者模式 狀態模式 策略模式 訪問者模式 |
JDK中使用了哪些設計模式?列舉幾個
- AWT和JDBC使用了橋接模式
- InputStreamReader和OutputStreamWriter使用了適配器模式
- IO包中許多類使用了裝飾者模式
- 基本類型包裝類使用了享元模式
- Proxy使用了代理模式
- StringBuilder,StringBuffer和PreparedStatement使用了建造者模式
- Object.clone()使用了原型模式
- Filter使用了責任鏈模式
- Runable使用了命令模式
- Iterator使用了迭代器模式和狀態模式
- ......等
反模式
反模式:是指用來解決問題的帶有共同性的不良方法.它們已經經過研究並分類,以防止日後重蹈覆轍,並能在研發尚未投產時辨認出來.
項目管理方面:
- 水中望月:向人演示還沒有實現的功能看上去會是什麼樣的.
- 軟件膨脹:隨着版本的升級,軟件越來越消耗系統資源.
- 不良管理:在未對主題有足夠認識的情況下管理一個專案.
設計方面:
- 反抽象:需要的功能並不暴露給用戶,導致用戶要在較高層次重新實現一些功能.
- 四不像:往往一個設計模型可以暴露不同的接口給用戶,不同的接口表現了模型的不同方面。然而把不同方面的功能混在一起是常見的不良設計.
- 亂麻球:系統沒有可辨認的結構,就像一團亂麻一樣.
- 萬應靈:一個對象瞭解的東西太多,或者要做太多的事情,就好像無所不能一樣.
- 屠龍術:沒有必要的複雜設計.
- 競爭危害:缺乏預見事件以不同順序發生的後果.
- 萬能類:在一個類的設計中,聚集了太多的函數.
- 吵鬧鬼:建立某對象的目的只是爲了傳送訊息給其它的物件.
- 溜溜問題:因結構(例如繼承)極度破碎冗長,而必須花費極大力氣來了解它.
編程方面:
- 硬編碼:或稱寫死.在實現某系統用途上設死該系統的運作環境.
- 紊亂代碼:幾乎無法理解的結構,特別是因爲代碼結構的濫用.
- 超布爾邏輯:不必要的比較,或是過於抽象的布爾計算.
- 無用的例外處理:插入了條件去防止運行時異常,但確在條件爲false時又throw.
方法方面:
- 剪貼編程:寧願拷貝(並修改)現存代碼而非創造通用的解決方案.
- 反重構:"移除功能性並以註解取代"的過程.
- 金錘子(銀彈):假設個人偏好的解決方案是世界通用.
- 掩耳盜鈴:假設一個已知的bug不會出現.
- 不成熟的優化:根據不足信息優化.
- 重新造個輪子:拒絕採納現有的解決方案,重寫一個.
- 造了個正方形的輪子:當一個優秀的方案存在時,創造一個蹩腳解決方案.
結構管理方面:
- 相依性地獄:由於需要的產品版本不匹配造成的種種問題,特別是在UNIX/Linux.
- DLL地獄:由於動態連接庫的版本,存在與否,和重複所造成的種種問題,特別是在Microsoft Windows.
- JAR地獄:源自於不同版本或位址的JAR檔案所造成的問題,常造成加載模組的欠缺.
- 延伸衝突:源自於Mac OS不同的延伸嘗試修補相同的系統部分.
一些組織方面的反模式:
- 分析麻痹症:項目分析過程已經長得不成比例,卻聽之任之.
- 搖錢樹項目:或者叫吃老本,一件有利可圖的產品讓新產品固步自封.
- 永遠革命:總是要不停地不計代價將現有系統移植到新的環境.
- 軍隊式管理:沒有容忍異議的空間.
- Scope creep:允許專案範圍增長而沒有適當控制.