“ 設計模式 ”是 “面向對象設計模式” 的簡稱,是軟件開發人員在軟件開發過程中面臨的一般問題的解決方案。
主要用來應對 類 的變化。
“ 設計模式 ”又分為:創建型模式、結構型模式、行為型模式。
本文介紹的“結構型”設計模式是從程序的結構上解決模塊之間的耦合問題。
首先是結構型模式的幾個細分:
1.橋接模式:對象的接口與實現
2.適配器模式:可以將類的一個接口匹配另一個接口
3.合成模式:對象的組合
4.門面模式:一個類表示一個子系統
5.裝飾模式:動態給對象添加職責
6.代理模式:一個簡單的對象代替一個復雜的稍后會被調用的復雜對象
1.橋接模式—— 適應對象接口與實現的多維變化
對象的變化,分為:接口變化、實現變化、屬性變化。
當出現單緯度的變化時(接口變化/實現變化),我們通常有兩個解決放啊:水平關聯/繼承。
但是,當多個緯度時變化時,單一的使用繼承會導致子類數量的快速增長,單一的使用水平關聯會導致擴展性變差。
所以在適應多維度變化時,我們使用橋接模式,將接口與實現分離。
2.適配器模式——將一個類的接口轉換成客戶希望的另外一個接口
當原接口不可修改,A和B兩個類的接口不一致,而需要將B類當A類來使用時,使用適配器模式。
3.合成模式—— 將對象組合成樹形結構以表示"部分-整體"的層次結構
一個樹結構由兩種節點組成:樹枝節點和樹葉節點。樹枝節點可以有子節點,而一個樹葉節點不可以有子節點。除了根節點外,其它節點有且只有一個父節點。
當我們需要抽象的問題,同樣具又這樣的性質的時候,就需要使用合成模式了。
例子來自:http://blog.csdn.net/koudaidai/article/details/7340192
在“故事”類中,組合一個 “根節點類”,就可以實現,故事既可以只有一重也有多重。
4.門面模式——用戶并不關注我們如果寫的代碼
在我們的生活中醫院就是這樣的。一般的醫院都會分為掛號、門診、化驗、收費、取藥等。看病的病人要想治好自己的病(相當于一個客戶端想要實現自己的功能)就要和醫院的各個部門打交道。首先,病人需要掛號,然后門診,如果醫生要求化驗的話,病人就要去化驗,然后再回到門診室,最后拿藥,經過一系列復雜的過程后才能完成看病的過程。
例子來自:http://blog.csdn.net/xingjiarong/article/details/50066133
解決這一辦法的設計是,提供一個接待員(門面模式)
用戶并不關心我們如何實現的功能,他們更希望直接使用
5.裝飾模式—— 在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能
裝飾模式是在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。
如果單一的使用繼承,將導致子類數量激增,并且只能改變單個子對象的功能。
如果單一的使用水平關聯,新的類與父類不再是父子關系。
6.代理模式——一個是你要訪問的對象(目標類),一個是代理對象
代理模式提供了對目標對象另外的訪問方式,即通過代理對象訪問目標對象。這樣做的好處是:可以在目標對象實現的基礎上,增強額外的功能操作,即擴展目標對象的功能。