一、創建型模式:都是用來幫助我們創建對象的!(關注對象的創建過程)
1.單例模式
保證一個類只有一個實例,並且提供一個訪問該實例的全局訪問點。
2.工廠模式("Gof book"中把工廠方法與抽象工廠分為兩種模式,所以創建型模式共為五種,這里只是為了方便整理,合在了工廠模式中)
-簡單工廠模式
用來生產同一等級結構的任意產品。(對於增加新的產品,需要修改已有代碼)
-工廠方法模式
用來生成同一等級結構中的固定產品。(支持增加任意產品)
-抽象工廠模式
用來生產不同產品族的全部產品。(對於增加新的產品,無能為力,支持增加產品族)
3.建造者模式
分離了對象子組件的單獨構造(由Builder來負責)和裝配(由Director負責),從而可以構造出復雜的對象。
4.原型模式
通過new產生一個對象需要非常繁瑣的數據准備或訪問權限,則可以使用原型模式。
二、結構型模式:是從程序的結構上實現松耦合,從而可以擴大整體的類結構,用來解決更大的問題。(關注對象和類的組織)
1.適配器模式
工作中的場景:經常用來做舊系統改造和升級;如果我們的系統開發之后再也不需要維護,那么很多模式都是沒必要的,但是不幸的是,事實卻是維護一個系統的代價往往是開發一個系統的數倍。
學習中見過的場景:
java.io.InputStreamReader(InputStream); java.io.OutpuStreamWriter(OutputStream)
2.代理模式
核心作用:通過代理,控制對對象的訪問!可以詳細控制訪問某個(某類)對象的方法,在調用這個方法前做前置處理,調用這個方法后做后置處理。(即:AOP的微觀實現!)
AOP(Aspect Oriented Programming面向切面編程)的核心實現機制!
開發框架中應用場景:
structs2中攔截器的實現;數據庫連接池關閉處理;Hibernate中延時加載的實現;mybatis中實現攔截器插件;AspectJ的實現;spring中AOP的實現(日志攔截,聲明式事務處理);web service;RMI遠程方法調用
3.橋接模式
實際開發中應用場景:
JDBC驅動程序;
AWT中的Peer架構;
銀行日志管理:格式分類:操作日志、交易日志、異常日志
距離分類:本地記錄日志、異地記錄日志
人力資源系統中的獎金計算模塊:獎金分類:個人獎金、團體獎金、激勵獎金。
部門分類:人事部門、銷售部門、研發部門。
OA系統中的消息處理:業務類型:普通消息、加急消息、特急消息。
發送消息方式:系統內消息、手機短信、郵件
4.裝飾模式
職責:動態的為一個對象增加新的功能;裝飾模式是一種用於代替繼承的技術,無須通過繼承增加子類就能擴展對象的新功能。使用對象的關聯關系代替繼承關系,更加靈活,同時避免類型體系的快速膨脹。
5.組合模式
使用場景:把部分和整體的關系用樹形結構來表示,從而使客戶端可以使用統一的方式處理部分對象和整體對象。
核心:抽象構件角色:定義了葉子和容器構件的共同點;葉子構件角色:無子節點;容器構件角色:有容器特征,可以包含子節點
6.外觀模式
開發中常見的場景:
頻率很高。哪里都會遇到。各種技術和框架中,都有外觀模式的使用。如:
JDBC封裝后的,commons提供的DBUtils類,Hibernate提供的工具類、Spring JDBC工具類等
7.享元模式
場景:內存屬於稀缺資源,不要隨便浪費,如果有很多個完全相同或相似的對象,我們可以通過享元模式,節省內存。
核心:享元模式以共享的方式高效地支持大量細粒度對象的重用;享元對象能做到共享的關鍵是區分了內部狀態和外部狀態。內部狀態:可以共享,不會隨環境變化而改變,外部狀態:不可以共享,會隨環境變化而改變
三、行為型模式:關注系統中對象之間的相互交互,研究系統在運行時對象之間的相互通信和協作,進一步明確對象的職責
1.責任鏈模式
定義:將能夠處理同一類請求的對象連成一條鏈,所提交的請求沿着鏈傳遞,鏈上的對象逐個判斷是否有能力處理該請求,如果能則處理,如果不能則傳遞給鏈上的下一個對象。
場景:打牌時,輪流出牌;接力賽跑;大學中,獎學金審批;公司中,公文審批
2.迭代器模式
場景:提供一種可以遍歷聚合對象的模式。又稱為:游標cursor模式;聚合對象:存儲數據;迭代器:遍歷數據
3.中介者模式
核心:如果一個系統中對象之間的聯系呈現為網狀結構,對象之間存在大量多對多關系,將導致關系極其復雜,這些對象稱為“同事對象”;我們可以引入一個中介者對象,使各個同事對象只跟中介者對象打交道,將復雜的網絡結構化解為一對多的星形結構。
4.命令模式
定義:將一個請求封裝為一個對象,從而使我們可用不同的請求對客戶進行參數化;對請求排隊或者記錄請求日志,以及支持可撤銷的操作。也稱之為:動作Action模式、事務transaction模式
5.解釋器模式
介紹:是一種不常用的設計模式;用於描述如何構成一個簡單的語言解釋器,主要用於使用面向對象語言開發的編譯器和解釋器設計;當我們需要開發一種新的語言時,可以考慮使用解釋器模式;盡量不要使用解釋器模式,后期維護會有很大麻煩。在項目中,可以使用Jruby,Groovy,java的js引擎來替代解釋器的作用,彌補java語言的不足
6.策略模式
本質:分離算法,選擇實現。
開發中常見的場景:JAVASE中GUI編程中,布局管理;Spring框架中,Resource接口,資源訪問策略;
7.模板方法模式
核心:處理某個流程的代碼已經都具備,但是其中某個節點的代碼暫時不能確定。因此,我們采用工廠方法模式,將這個節點的代碼實現轉移給子類完成。即:處理步驟父類中定義好,具體實現延遲到子類中定義
8.狀態模式
核心:用於解決系統中復雜對象的狀態轉移以及不同狀態下行為的封裝問題
9.觀察者模式
核心:觀察者模式主要用於1:N的通知。當一個對象(目標對象Subject或Objservable)的狀態變化時,他需要及時告知一系列對象(觀察者對象,Observer),令他們做出響應
10.備忘錄模式
核心:就是保存某個對象內部狀態的拷貝,這樣以后就可以將該對象恢復到原先的狀態。
11.訪問者模式
核心:將作用於某種數據結構中的各元素的操作分離出來封裝成獨立的類,使其在不改變數據結構的前提下可以添加作用於這些元素的新的操作,為數據結構中的每個元素提供多種訪問方式。