1、設計原則web
- 封裝變化
- 多用組合,少用繼承
- 針對接口編程,不針對實現編程
- 爲交互對象之間的鬆緊耦合設計而努力
- 對擴展開放,都修稿關閉
- 依賴抽象,不要依賴具體類
- 最少知識原則:之和朋友交談
- 好萊塢原則:別找我,我會找你(由超類主控一切,當他們須要的時候,天然回去調用子類)
- 類應該只有一個改變的理由
2、設計模式
- 策略模式
定義算法族,分別封裝起來,讓他們之間能夠互相替換,次模式讓算法的變化獨立於使用算法的客戶
2. 觀察者模式
在對象之間定義一對多的依賴,這樣一來,當一個對象改變狀態,依賴它的對象都會收到通知,並自動更新
3. 裝飾者模式
動態的將責任附加到對象上。想喲啊擴展功能,裝飾者提供有別於繼承的另外一種選擇
要點:
- 繼承屬於擴展形式之一,但不見得是達到彈性設計的最佳方式
- 在咱們的設計中,應該容許行爲能夠被擴展,而無需修改現有的代碼
- 組合和委託可用於在運行時動態地加上新的行爲
- 除了繼承,裝飾者模式也可讓咱們擴展行爲
- 裝飾者模式意味着一羣裝飾者類,這些類用來包裝具體組件
- 裝飾者類反應出被裝飾者的組件類型(事實上,他們具備相同的類型,都是通過接口或繼承實現)
- 裝飾者能夠被裝飾者的行爲前面與/或後面加上本身的行爲,甚至將被裝飾者的行爲整個取代掉,而達到特定的目的
- 能夠用無數個裝飾者包裝一個組件
- 裝飾者通常對組件的客戶是透明的,除非客戶程序依賴於組件的具體類型
- 裝飾者會致使設計中出現許多小對象,若是過分使用,會讓程序變得複雜
4.
抽象工廠模式:
提供一個接口,用於建立相關或依賴對象的家族,而不須要明確指定具體類
工廠方法模式:
定義了一個建立對象的接口,但由子類決定要實例化的類是哪個。工廠方法讓類把實例化推遲到子類
要點:
- 全部的工廠都是用來封裝對象的建立
- 簡單工廠,雖然不是真正的設計模式,可是仍不失爲一個簡單的方法,能夠將客戶程序從具體類解耦
- 工廠方法使用繼承:把對象的建立委託給子類,子類實現工廠方法來建立對象
- 抽象工廠使用對象組合:對象的建立被實例化在工廠接口所暴露出來的方法中
- 全部工廠模式都經過減小用功程序的具體類之間的依賴促進鬆緊耦合
- 工廠方法容許類將實例化延遲到子類進行
- 抽象工廠建立相關的對象家族,而不須要依賴他們的具體類
- 依賴倒置原則,指導咱們避免依賴具體類型,而儘可能依賴抽象
- 工廠是頗有威力的技巧,幫助咱們針對抽象編程,而不要針對具體類型編程
5.單件(例)模式
確保一個類只有一個實例,並提供全局訪問點
要點:
- 單件模式確保程序中一個類最多隻有一個實例
- 單件模式也提供訪問這個實例的全局點
- 在Java中實現單件模式須要私有化構造器,一個靜態方法和一個靜態變量
- 肯定在性能和資源上的限制,而後當心地選擇適當的方案來實現的那件,以解決多線程的問題
- 若是使用多個類加載器。能夠致使單件失效而產生多個實例
- 若是使用JVM1.2或以前的版本,必須創建註冊表,以避免垃圾收集器將的單件回收
6.命令磨時間哦
將請求封裝成對象,這可讓你使用不一樣的情iqu,隊列,或者日誌請求來參數化其餘對象。命令模式也能夠支持撤銷操做
要點:
- 在被解耦的二者之間是經過命令對象昂進行溝通的,命令對象封裝了接受者和一個或一組動做
- 調用者經過調用命令對象的execute()發出請求,這會使得接受者的動做被調用
- 調用者能夠接受命令看成參數,甚至在運行時動地進行
- 命令能夠支持撤銷,作法是實現一個undo()方法來回到execute()被執前的狀態
- 宏命令是命令的一種簡單延伸,容許調用多個命令。宏方法也能夠支持撤銷
- 實際操做時,很常見使用「聰明」對象,也就是直接實現了請求,而不是將工做委託給接受者
- 命令也能夠用來實現日誌和事物系統
7.
適配器模式:
將一個類讓接口,轉換成客戶指望的另外一個接口。適配器讓本來不兼容的類能夠合做無間
外觀模式:
提供了一個統一的接口,用來訪問子系統中的一羣接口。外觀定義了一個高層接口,讓子系統更容易調用
要點:
- 當須要使用一個現有的類而其接口並不符合你的須要時,就是用適配器
- 當須要簡化並贊成一個很大的接口或者一羣複雜的接口時,使用外觀
- 適配器改變接口以符合客戶的指望
- 外觀將客戶從一個複雜的子系統中解耦出來
- 實現一個適配器可能須要一番功夫,也可能不費功夫,視目標接口的大小與複雜度而定
- 實現一個外觀,須要將子系統組合外觀中,而後將工做委託給子系統執行
- 適配器模式有兩種形式:對象適配器和類適配器。類適配器須要用到多重繼承(Java不支持多重繼承)
- 適配器將一個對象包裝起來一改變接口;裝飾者將一個對象包裝起來以增長新的行爲和責任;外觀將一羣對象「包裝」起來以簡化其接口
8.模板方法模式
在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中。模板方法是的子類能夠在不改變算法結構的狀況下,從新定義算法中的某些步驟
要點:
- 「模板方法」定義了算法的步驟,把這些步驟的實現延遲到子類
- 模板方法爲咱們提供了一種代碼複用的重要技巧
- 模板方法的抽象類能夠定義具體方法,抽象方法和鉤子
- 抽象方法由子類實現
- 鉤子是一種方法,它在抽象類中不作事,或者只作默認的事情,子類能夠選擇要不要去覆蓋它
- 爲了防止子類改變模板方法中的算法,能夠將模板方法聲明爲final
- 好萊塢原則告訴咱們,將決策權放在高層模板中,以便決定如何以及什麼時候調用低層模板
- 你將在真是世界代碼中看到模板方法模式的多變體,不要期待他們全都是一眼就能夠被你認出來的
- 策略模式和模板方法模式都封裝算法,一個用組合,一個用繼承
- 工廠方法是模板方法的一種特殊版本
9.
迭代器模式:
提供一種方法順序訪問一個聚合對象中的各個元素,而又不暴露其內部的表示
組合模式:
容許你將對象組成樹形結構來表示「總體/部分」的層次結構。組合能讓客戶以一致的方式處理個別對象和對象組合
要點:
- 迭代器容許訪問聚合的元素,而不須要暴露他的內部結構
- 迭代器將遍歷聚合的工做封裝進一個對象中
- 當使用迭代器的時候,咱們依賴聚合提供遍歷
- 迭代器提供了一個通用的接口,讓咱們遍歷聚合的項,當咱們編碼使用聚合的項時,就可使用多態機制
- 咱們應該努力讓一個結構,可同時包容個別對象和組合對象
- 組合模式容許客戶對個別對象及組合對象一視同仁
- 組合結構內的任意對象稱爲組件,組件能夠是組合,也能夠是葉節點
- 在實現組合模式時,有許多設計上的折中。你要根據組要平衡透明性和安全性
10. 狀態模式
容許對象在內部狀態改變是改變他的行爲,對象看起來好像修改的他的類
要點:
- 狀態模式容許一個對象基於內部狀態而擁有不一樣的行爲
- 和程序狀態機不一樣,狀態模式用類表明狀態
- context會將行爲封裝進一個類,咱們把之後須要作的任何改變局部化了
- 狀態模式和策略模式有相同的類圖,可是他們的意圖不一樣
- 策略模式一般或用行爲域算法類配置context類
- 狀態模式容許context隨着狀態的改變而改變行爲
- 狀態轉換能夠由state類或context類控制
- 使用狀態 模式一般會致使設計中類的數目大量增長
- 狀態類能夠被多個context實例共享
11. 代理模式
爲另外一個對象提供一個替身或佔位符以訪問這個對象
要點:
- 代理模式爲另外一個對象提供表明,以便控制客戶對對象的訪問,管理訪問的方式有許多種
- 遠程代理客戶和遠程對象之間的交互
- 虛擬代理控制訪問實例化開銷大的對象
- 保護代理基於調用者對對象方法的訪問
- 代理模式有許多變體,例如:緩存代理,同步代理,防火牆代理和寫入時複製代理
- 代理在結構上相似於裝飾者,可是目的不一樣
- 裝飾者模式爲對象加上行爲,而代理則是控制訪問
- Java內置的代理支持,能夠根據須要創建動態代理,並將全部調用分配到所選的處理器
- 就和其餘的包裝者同樣,代理會形成設計中類的數量增長
12. 複合模式
複合模式結合兩個或以上的模式,組成一個解決方案,解決一再發生的通常性問題。(MVC,model2)
要點:
- MVC是複合模式,結合觀察者模式,策略模式和組合模式
- 模型使用觀察者模式,以便觀察者更新,同時保持二者之間的解耦
- 控制器是視圖的策咯,視圖可使用不一樣的控制器實現,獲得不一樣的行爲
- 視圖使用組合模式實現用戶界面,用戶界面一般組合了嵌套的組件,項面板,框架和按鈕
- 這些模式攜手合做,把MVC模型的三層解耦,這樣能夠保持設計乾淨又有彈性
- 適配器模式用來將新的模型適配成已有的視圖和控制器
- Model2是MVC在web上的應用
- 在Model2中,控制器實現成Servlet,而JSP/HTML實現視圖