工廠模式(Factory Pattern)
工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一,這種型別的設計模式屬于創建型模式,它提供了一種創建物件的最佳方式,
在工廠模式中,我們在創建物件時不會對客戶端暴露創建邏輯,并且是通過使用一個共同的介面來指向新創建的物件,
意圖:定義一個創建物件的介面,讓其子類自己決定實體化哪一個工廠類,工廠模式使其創建程序延遲到子類進行,
主要解決:主要解決介面選擇的問題,
何時使用:我們明確地計劃不同條件下創建不同實體時,
如何解決:讓其子類實作工廠介面,回傳的也是一個抽象的產品,
關鍵代碼:創建程序在其子類執行,
應用實體:
1、您需要一輛汽車,可以直接從工廠里面提貨,而不用去管這輛汽車是怎么做出來的,以及這個汽車里面的具體實作,
2、Hibernate 換資料庫只需換方言和驅動就可以,
優點:
1、一個呼叫者想創建一個物件,只要知道其名稱就可以了,
2、擴展性高,如果想增加一個產品,只要擴展一個工廠類就可以,
3、屏蔽產品的具體實作,呼叫者只關心產品的介面,
缺點:每次增加一個產品時,都需要增加一個具體類和物件實作工廠,使得系統中類的個數成倍增加,在一定程度上增加了系統的復雜度,同時也增加了系統具體類的依賴,這并不是什么好事,
使用場景:
1、日志記錄器:記錄可能記錄到本地硬碟、系統事件、遠程服務器等,用戶可以選擇記錄日志到什么地方,
2、資料庫訪問,當用戶不知道最后系統采用哪一類資料庫,以及資料庫可能有變化時,
3、設計一個連接服務器的框架,需要三個協議,"POP3"、"IMAP"、"HTTP",可以把這三個作為產品類,共同實作一個介面,
注意事項:作為一種創建類模式,在任何需要生成復雜物件的地方,都可以使用工廠方法模式,有一點需要注意的地方就是復雜物件適合使用工廠模式,而簡單物件,特別是只需要通過 new 就可以完成創建的物件,無需使用工廠模式,如果使用工廠模式,就需要引入一個工廠類,會增加系統的復雜度,
抽象工廠模式(Abstract Factory Pattern)
抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠創建其他工廠,該超級工廠又稱為其他工廠的工廠,這種型別的設計模式屬于創建型模式,它提供了一種創建物件的最佳方式,
在抽象工廠模式中,介面是負責創建一個相關物件的工廠,不需要顯式指定它們的類,每個生成的工廠都能按照工廠模式提供物件,
意圖:提供一個創建一系列相關或相互依賴物件的介面,而無需指定它們具體的類,
主要解決:主要解決介面選擇的問題,
何時使用:系統的產品有多于一個的產品族,而系統只消費其中某一族的產品,
如何解決:在一個產品族里面,定義多個產品,
關鍵代碼:在一個工廠里聚合多個同類產品,
應用實體:作業了,為了參加一些聚會,肯定有兩套或多套衣服吧,比如說有商務裝(成套,一系列具體產品)、時尚裝(成套,一系列具體產品),甚至對于一個家庭來說,可能有商務女裝、商務男裝、時尚女裝、時尚男裝,這些也都是成套的,即一系列具體產品,假設一種情況(現實中是不存在的,要不然,沒法進入共產主義了,但有利于說明抽象工廠模式),在您的家中,某一個衣柜(具體工廠)只能存放某一種這樣的衣服(成套,一系列具體產品),每次拿這種成套的衣服時也自然要從這個衣柜中取出了,用 OOP 的思想去理解,所有的衣柜(具體工廠)都是衣柜類的(抽象工廠)某一個,而每一件成套的衣服又包括具體的上衣(某一具體產品),褲子(某一具體產品),這些具體的上衣其實也都是上衣(抽象產品),具體的褲子也都是褲子(另一個抽象產品),
優點:當一個產品族中的多個物件被設計成一起作業時,它能保證客戶端始終只使用同一個產品族中的物件,
缺點:產品族擴展非常困難,要增加一個系列的某一產品,既要在抽象的 Creator 里加代碼,又要在具體的里面加代碼,
使用場景:
1、QQ 換皮膚,一整套一起換,
2、生成不同作業系統的程式,
注意事項:產品族難擴展,產品等級易擴展,
單例模式(Singleton Pattern)
單例模式(Singleton Pattern)是 Java 中最簡單的設計模式之一,這種型別的設計模式屬于創建型模式,它提供了一種創建物件的最佳方式,
這種模式涉及到一個單一的類,該類負責創建自己的物件,同時確保只有單個物件被創建,這個類提供了一種訪問其唯一的物件的方式,可以直接訪問,不需要實體化該類的物件,
注意:
- 1、單例類只能有一個實體,
- 2、單例類必須自己創建自己的唯一實體,
- 3、單例類必須給所有其他物件提供這一實體,
意圖:保證一個類僅有一個實體,并提供一個訪問它的全域訪問點,
主要解決:一個全域使用的類頻繁地創建與銷毀,
何時使用:當您想控制實體數目,節省系統資源的時候,
如何解決:判斷系統是否已經有這個單例,如果有則回傳,如果沒有則創建,
關鍵代碼:建構式是私有的,
應用實體:
- 1、一個班級只有一個班主任,
- 2、Windows 是多行程多執行緒的,在操作一個檔案的時候,就不可避免地出現多個行程或執行緒同時操作一個檔案的現象,所以所有檔案的處理必須通過唯一的實體來進行,
- 3、一些設備管理器常常設計為單例模式,比如一個電腦有兩臺列印機,在輸出的時候就要處理不能兩臺列印機列印同一個檔案,
優點:
- 1、在記憶體里只有一個實體,減少了記憶體的開銷,尤其是頻繁的創建和銷毀實體(比如管理學院首頁頁面快取),
- 2、避免對資源的多重占用(比如寫檔案操作),
缺點:沒有介面,不能繼承,與單一職責原則沖突,一個類應該只關心內部邏輯,而不關心外面怎么樣來實體化,
使用場景:
- 1、要求生產唯一序列號,
- 2、WEB 中的計數器,不用每次重繪都在資料庫里加一次,用單例先快取起來,
- 3、創建的一個物件需要消耗的資源過多,比如 I/O 與資料庫的連接等,
注意事項:getInstance() 方法中需要使用同步鎖 synchronized (Singleton.class) 防止多執行緒同時進入造成 instance 被多次實體化,
建造者模式(Builder Pattern)
建造者模式(Builder Pattern)使用多個簡單的物件一步一步構建成一個復雜的物件,這種型別的設計模式屬于創建型模式,它提供了一種創建物件的最佳方式,
一個 Builder 類會一步一步構造最終的物件,該 Builder 類是獨立于其他物件的,
意圖:將一個復雜的構建與其表示相分離,使得同樣的構建程序可以創建不同的表示,
主要解決:主要解決在軟體系統中,有時候面臨著"一個復雜物件"的創建作業,其通常由各個部分的子物件用一定的演算法構成;由于需求的變化,這個復雜物件的各個部分經常面臨著劇烈的變化,但是將它們組合在一起的演算法卻相對穩定,
何時使用:一些基本部件不會變,而其組合經常變化的時候,
如何解決:將變與不變分離開,
關鍵代碼:建造者:創建和提供實體,導演:管理建造出來的實體的依賴關系,
應用實體:
1、去肯德基,漢堡、可樂、薯條、炸雞翅等是不變的,而其組合是經常變化的,生成出所謂的"套餐",
2、JAVA 中的 StringBuilder,
優點:
1、建造者獨立,易擴展,
2、便于控制細節風險,
缺點:
1、產品必須有共同點,范圍有限制,
2、如內部變化復雜,會有很多的建造類,
使用場景:
1、需要生成的物件具有復雜的內部結構,
2、需要生成的物件內部屬性本身相互依賴,
注意事項:與工廠模式的區別是:建造者模式更加關注與零件裝配的順序,
原型模式(Prototype Pattern)
原型模式(Prototype Pattern)是用于創建重復的物件,同時又能保證性能,這種型別的設計模式屬于創建型模式,它提供了一種創建物件的最佳方式,
這種模式是實作了一個原型介面,該介面用于創建當前物件的克隆,當直接創建物件的代價比較大時,則采用這種模式,例如,一個物件需要在一個高代價的資料庫操作之后被創建,我們可以快取該物件,在下一個請求時回傳它的克隆,在需要的時候更新資料庫,以此來減少資料庫呼叫,
意圖:用原型實體指定創建物件的種類,并且通過拷貝這些原型創建新的物件,
主要解決:在運行期建立和洗掉原型,
何時使用:
1、當一個系統應該獨立于它的產品創建,構成和表示時,
2、當要實體化的類是在運行時刻指定時,例如,通過動態裝載,
3、為了避免創建一個與產品類層次平行的工廠類層次時,
4、當一個類的實體只能有幾個不同狀態組合中的一種時,建立相應數目的原型并克隆它們可能比每次用合適的狀態手工實體化該類更方便一些,
如何解決:利用已有的一個原型物件,快速地生成和原型物件一樣的實體,
關鍵代碼:
1、實作克隆操作,在 JAVA 繼承 Cloneable,重寫 clone(),在 .NET 中可以使用 Object 類的 MemberwiseClone() 方法來實作物件的淺拷貝或通過序列化的方式來實作深拷貝,
2、原型模式同樣用于隔離類物件的使用者和具體型別(易變類)之間的耦合關系,它同樣要求這些"易變類"擁有穩定的介面,
應用實體:
1、細胞分裂,
2、JAVA 中的 Object clone() 方法,
優點:
1、性能提高,
2、逃避建構式的約束,
缺點:
1、配備克隆方法需要對類的功能進行通盤考慮,這對于全新的類不是很難,但對于已有的類不一定很容易,特別當一個類參考不支持串行化的間接物件,或者參考含有回圈結構的時候,
2、必須實作 Cloneable 介面,
使用場景:
1、資源優化場景,
2、類初始化需要消化非常多的資源,這個資源包括資料、硬體資源等,
3、性能和安全要求的場景,
4、通過 new 產生一個物件需要非常繁瑣的資料準備或訪問權限,則可以使用原型模式,
5、一個物件多個修改者的場景,
6、一個物件需要提供給其他物件訪問,而且各個呼叫者可能都需要修改其值時,可以考慮使用原型模式拷貝多個物件供呼叫者使用,
7、在實際專案中,原型模式很少單獨出現,一般是和工廠方法模式一起出現,通過 clone 的方法創建一個物件,然后由工廠方法提供給呼叫者,原型模式已經與 Java 融為渾然一體,大家可以隨手拿來使用,
注意事項:與通過對一個類進行實體化來構造新物件不同的是,原型模式是通過拷貝一個現有物件生成新物件的,淺拷貝實作 Cloneable,重寫,深拷貝是通過實作 Serializable 讀取二進制流,
配接器模式(Adapter Pattern)
配接器模式(Adapter Pattern)是作為兩個不兼容的介面之間的橋梁,這種型別的設計模式屬于結構型模式,它結合了兩個獨立介面的功能,
這種模式涉及到一個單一的類,該類負責加入獨立的或不兼容的介面功能,舉個真實的例子,讀卡器是作為記憶體卡和筆記本之間的配接器,您將記憶體卡插入讀卡器,再將讀卡器插入筆記本,這樣就可以通過筆記本來讀取記憶體卡,
我們通過下面的實體來演示配接器模式的使用,其中,音頻播放器設備只能播放 mp3 檔案,通過使用一個更高級的音頻播放器來播放 vlc 和 mp4 檔案,
意圖:將一個類的介面轉換成客戶希望的另外一個介面,配接器模式使得原本由于介面不兼容而不能一起作業的那些類可以一起作業,
主要解決:主要解決在軟體系統中,常常要將一些"現存的物件"放到新的環境中,而新環境要求的介面是現物件不能滿足的,
何時使用:
1、系統需要使用現有的類,而此類的介面不符合系統的需要,
2、想要建立一個可以重復使用的類,用于與一些彼此之間沒有太大關聯的一些類,包括一些可能在將來引進的類一起作業,這些源類不一定有一致的介面,
3、通過介面轉換,將一個類插入另一個類系中,(比如老虎和飛禽,現在多了一個飛虎,在不增加物體的需求下,增加一個配接器,在里面包容一個虎物件,實作飛的介面,)
如何解決:繼承或依賴(推薦),
關鍵代碼:配接器繼承或依賴已有的物件,實作想要的目標介面,
應用實體:
1、美國電器 110V,中國 220V,就要有一個配接器將 110V 轉化為 220V,
2、JAVA JDK 1.1 提供了 Enumeration 介面,而在 1.2 中提供了 Iterator 介面,想要使用 1.2 的 JDK,則要將以前系統的 Enumeration 介面轉化為 Iterator 介面,這時就需要配接器模式,
3、在 LINUX 上運行 WINDOWS 程式,
4、JAVA 中的 jdbc,
優點:
1、可以讓任何兩個沒有關聯的類一起運行,
2、提高了類的復用,
3、增加了類的透明度,
4、靈活性好,
缺點:
1、過多地使用配接器,會讓系統非常零亂,不易整體進行把握,比如,明明看到呼叫的是 A 介面,其實內部被適配成了 B 介面的實作,一個系統如果太多出現這種情況,無異于一場災難,因此如果不是很有必要,可以不使用配接器,而是直接對系統進行重構,
2.由于 JAVA 至多繼承一個類,所以至多只能適配一個適配者類,而且目標類必須是抽象類,
使用場景:有動機地修改一個正常運行的系統的介面,這時應該考慮使用配接器模式,
注意事項:配接器不是在詳細設計時添加的,而是解決正在服役的專案的問題,
橋接模式(Bridge Pattern)
橋接(Bridge)是用于把抽象化與實作化解耦,使得二者可以獨立變化,這種型別的設計模式屬于結構型模式,它通過提供抽象化和實作化之間的橋接結構,來實作二者的解耦,
這種模式涉及到一個作為橋接的介面,使得物體類的功能獨立于介面實作類,這兩種型別的類可被結構化改變而互不影響,
我們通過下面的實體來演示橋接模式(Bridge Pattern)的用法,其中,可以使用相同的抽象類方法但是不同的橋接實作類,來畫出不同顏色的圓,
意圖:將抽象部分與實作部分分離,使它們都可以獨立的變化,
主要解決:在有多種可能會變化的情況下,用繼承會造成類爆炸問題,擴展起來不靈活,
何時使用:實作系統可能有多個角度分類,每一種角度都可能變化,
如何解決:把這種多角度分類分離出來,讓它們獨立變化,減少它們之間耦合,
關鍵代碼:抽象類依賴實作類,
應用實體:
1、豬八戒從天蓬元帥轉世投胎到豬,轉世投胎的機制將塵世劃分為兩個等級,即:靈魂和肉體,前者相當于抽象化,后者相當于實作化,生靈通過功能的委派,呼叫肉體物件的功能,使得生靈可以動態地選擇,
2、墻上的開關,可以看到的開關是抽象的,不用管里面具體怎么實作的,
優點:
1、抽象和實作的分離,
2、優秀的擴展能力,
3、實作細節對客戶透明,
缺點:橋接模式的引入會增加系統的理解與設計難度,由于聚合關聯關系建立在抽象層,要求開發者針對抽象進行設計與編程,
使用場景:
1、如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的繼承聯系,通過橋接模式可以使它們在抽象層建立一個關聯關系,
2、對于那些不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加的系統,橋接模式尤為適用,
3、一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴展,
注意事項:對于兩個獨立變化的維度,使用橋接模式再適合不過了,
過濾器模式(Filter、Criteria Pattern)
過濾器模式(Filter Pattern)或標準模式(Criteria Pattern)是一種設計模式,這種模式允許開發人員使用不同的標準來過濾一組物件,通過邏輯運算以解耦的方式把它們連接起來,這種型別的設計模式屬于結構型模式,它結合多個標準來獲得單一標準,
組合模式(Composite Pattern)
組合模式(Composite Pattern),又叫部分整體模式,是用于把一組相似的物件當作一個單一的物件,組合模式依據樹形結構來組合物件,用來表示部分以及整體層次,這種型別的設計模式屬于結構型模式,它創建了物件組的樹形結構,
這種模式創建了一個包含自己物件組的類,該類提供了修改相同物件組的方式,
我們通過下面的實體來演示組合模式的用法,實體演示了一個組織中員工的層次結構,
意圖:將物件組合成樹形結構以表示"部分-整體"的層次結構,組合模式使得用戶對單個物件和組合物件的使用具有一致性,
主要解決:它在我們樹型結構的問題中,模糊了簡單元素和復雜元素的概念,客戶程式可以像處理簡單元素一樣來處理復雜元素,從而使得客戶程式與復雜元素的內部結構解耦,
何時使用:
1、您想表示物件的部分-整體層次結構(樹形結構),
2、您希望用戶忽略組合物件與單個物件的不同,用戶將統一地使用組合結構中的所有物件,
如何解決:樹枝和葉子實作統一介面,樹枝內部組合該介面,
關鍵代碼:樹枝內部組合該介面,并且含有內部屬性 List,里面放 Component,
應用實體:
1、算術運算式包括運算元、運算子和另一個運算元,其中,另一個運算元也可以是運算元、運算子和另一個運算元,
2、在 JAVA AWT 和 SWING 中,對于 Button 和 Checkbox 是樹葉,Container 是樹枝,
優點:
1、高層模塊呼叫簡單,
2、節點自由增加,
缺點:在使用組合模式時,其葉子和樹枝的宣告都是實作類,而不是介面,違反了依賴倒置原則,
使用場景:部分、整體場景,如樹形選單,檔案、檔案夾的管理,
注意事項:定義時為具體類,
裝飾器模式(Decorator Pattern)
裝飾器模式(Decorator Pattern)允許向一個現有的物件添加新的功能,同時又不改變其結構,這種型別的設計模式屬于結構型模式,它是作為現有的類的一個包裝,
這種模式創建了一個裝飾類,用來包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能,
我們通過下面的實體來演示裝飾器模式的用法,其中,我們將把一個形狀裝飾上不同的顏色,同時又不改變形狀類,
意圖:動態地給一個物件添加一些額外的職責,就增加功能來說,裝飾器模式相比生成子類更為靈活,
主要解決:一般的,我們為了擴展一個類經常使用繼承方式實作,由于繼承為類引入靜態特征,并且隨著擴展功能的增多,子類會很膨脹,
何時使用:在不想增加很多子類的情況下擴展類,
如何解決:將具體功能職責劃分,同時繼承裝飾者模式,
關鍵代碼:
1、Component 類充當抽象角色,不應該具體實作,
2、修飾類參考和繼承 Component 類,具體擴展類重寫父類方法,
應用實體:
1、孫悟空有 72 變,當他變成"廟宇"后,他的根本還是一只猴子,但是他又有了廟宇的功能,
2、不論一幅畫有沒有畫框都可以掛在墻上,但是通常都是有畫框的,并且實際上是畫框被掛在墻上,在掛在墻上之前,畫可以被蒙上玻璃,裝到框子里;這時畫、玻璃和畫框形成了一個物體,
優點:裝飾類和被裝飾類可以獨立發展,不會相互耦合,裝飾模式是繼承的一個替代模式,裝飾模式可以動態擴展一個實作類的功能,
缺點:多層裝飾比較復雜,
使用場景:
1、擴展一個類的功能,
2、動態增加功能,動態撤銷,
注意事項:可代替繼承,
外觀模式(Facade Pattern)
外觀模式(Facade Pattern)隱藏系統的復雜性,并向客戶端提供了一個客戶端可以訪問系統的介面,這種型別的設計模式屬于結構型模式,它向現有的系統添加一個介面,來隱藏系統的復雜性,
這種模式涉及到一個單一的類,該類提供了客戶端請求的簡化方法和對現有系統類方法的委托呼叫,
意圖:為子系統中的一組介面提供一個一致的界面,外觀模式定義了一個高層介面,這個介面使得這一子系統更加容易使用,
主要解決:降低訪問復雜系統的內部子系統時的復雜度,簡化客戶端之間的介面,
何時使用:
1、客戶端不需要知道系統內部的復雜聯系,整個系統只需提供一個"接待員"即可,
2、定義系統的入口,
如何解決:客戶端不與系統耦合,外觀類與系統耦合,
關鍵代碼:在客戶端和復雜系統之間再加一層,這一層將呼叫順序、依賴關系等處理好,
應用實體:
1、去醫院看病,可能要去掛號、門診、劃價、取藥,讓患者或患者家屬覺得很復雜,如果有提供接待人員,只讓接待人員來處理,就很方便,
2、JAVA 的三層開發模式,
優點:
1、減少系統相互依賴,
2、提高靈活性,
3、提高了安全性,
缺點:不符合開閉原則,如果要改東西很麻煩,繼承重寫都不合適,
使用場景:
1、為復雜的模塊或子系統提供外界訪問的模塊,
2、子系統相對獨立,
3、預防低水平人員帶來的風險,
注意事項:在層次化結構中,可以使用外觀模式定義系統中每一層的入口,
享元模式(Flyweight Pattern)
享元模式(Flyweight Pattern)主要用于減少創建物件的數量,以減少記憶體占用和提高性能,這種型別的設計模式屬于結構型模式,它提供了減少物件數量從而改善應用所需的物件結構的方式,
享元模式嘗試重用現有的同類物件,如果未找到匹配的物件,則創建新物件,我們將通過創建 5 個物件來畫出 20 個分布于不同位置的圓來演示這種模式,由于只有 5 種可用的顏色,所以 color 屬性被用來檢查現有的 Circle 物件,
意圖:運用共享技術有效地支持大量細粒度的物件,
主要解決:在有大量物件時,有可能會造成記憶體溢位,我們把其中共同的部分抽象出來,如果有相同的業務請求,直接回傳在記憶體中已有的物件,避免重新創建,
何時使用:
1、系統中有大量物件,
2、這些物件消耗大量記憶體,
3、這些物件的狀態大部分可以外部化,
4、這些物件可以按照內蘊狀態分為很多組,當把外蘊物件從物件中剔除出來時,每一組物件都可以用一個物件來代替,
5、系統不依賴于這些物件身份,這些物件是不可分辨的,
如何解決:用唯一標識碼判斷,如果在記憶體中有,則回傳這個唯一標識碼所標識的物件,
關鍵代碼:用 HashMap 存盤這些物件,
應用實體:
1、JAVA 中的 String,如果有則回傳,如果沒有則創建一個字串保存在字串快取池里面,
2、資料庫的資料池,
優點:大大減少物件的創建,降低系統的記憶體,使效率提高,
缺點:提高了系統的復雜度,需要分離出外部狀態和內部狀態,而且外部狀態具有固有化的性質,不應該隨著內部狀態的變化而變化,否則會造成系統的混亂,
使用場景:
1、系統有大量相似物件,
2、需要緩沖池的場景,
注意事項:
1、注意劃分外部狀態和內部狀態,否則可能會引起執行緒安全問題,
2、這些類必須有一個工廠物件加以控制,
代理模式(Proxy Pattern)
在代理模式(Proxy Pattern)中,一個類代表另一個類的功能,這種型別的設計模式屬于結構型模式,
在代理模式中,我們創建具有現有物件的物件,以便向外界提供功能介面,
意圖:為其他物件提供一種代理以控制對這個物件的訪問,
主要解決:在直接訪問物件時帶來的問題,比如說:要訪問的物件在遠程的機器上,在面向物件系統中,有些物件由于某些原因(比如物件創建開銷很大,或者某些操作需要安全控制,或者需要行程外的訪問),直接訪問會給使用者或者系統結構帶來很多麻煩,我們可以在訪問此物件時加上一個對此物件的訪問層,
何時使用:想在訪問一個類時做一些控制,
如何解決:增加中間層,
關鍵代碼:實作與被代理類組合,
應用實體:
1、Windows 里面的快捷方式,
2、豬八戒去找高翠蘭結果是孫悟空變的,可以這樣理解:把高翠蘭的外貌抽象出來,高翠蘭本人和孫悟空都實作了這個介面,豬八戒訪問高翠蘭的時候看不出來這個是孫悟空,所以說孫悟空是高翠蘭代理類,
3、買火車票不一定在火車站買,也可以去代售點,
4、一張支票或銀行存單是賬戶中資金的代理,支票在市場交易中用來代替現金,并提供對簽發人賬號上資金的控制,
5、spring aop,
優點:
1、職責清晰,
2、高擴展性,
3、智能化,
缺點:
1、由于在客戶端和真實主題之間增加了代理物件,因此有些型別的代理模式可能會造成請求的處理速度變慢,
2、實作代理模式需要額外的作業,有些代理模式的實作非常復雜,
使用場景:按職責來劃分,通常有以下使用場景:
1、遠程代理,
2、虛擬代理,
3、Copy-on-Write 代理,
4、保護(Protect or Access)代理,
5、Cache代理,
6、防火墻(Firewall)代理,
7、同步化(Synchronization)代理,
8、智能參考(Smart Reference)代理,
注意事項:
1、和配接器模式的區別:配接器模式主要改變所考慮物件的介面,而代理模式不能改變所代理類的介面,
2、和裝飾器模式的區別:裝飾器模式為了增強功能,而代理模式是為了加以控制,
責任鏈模式(Chain of Responsibility Pattern)
顧名思義,責任鏈模式(Chain of Responsibility Pattern)為請求創建了一個接收者物件的鏈,這種模式給予請求的型別,對請求的發送者和接收者進行解耦,這種型別的設計模式屬于行為型模式,
在這種模式中,通常每個接收者都包含對另一個接收者的參考,如果一個物件不能處理該請求,那么它會把相同的請求傳給下一個接收者,依此類推,
意圖:避免請求發送者與接收者耦合在一起,讓多個物件都有可能接收請求,將這些物件連接成一條鏈,并且沿著這條鏈傳遞請求,直到有物件處理它為止,
主要解決:職責鏈上的處理者負責處理請求,客戶只需要將請求發送到職責鏈上即可,無須關心請求的處理細節和請求的傳遞,所以職責鏈將請求的發送者和請求的處理者解耦了,
何時使用:在處理訊息的時候以過濾很多道,
如何解決:攔截的類都實作統一介面,
關鍵代碼:Handler 里面聚合它自己,在 HandlerRequest 里判斷是否合適,如果沒達到條件則向下傳遞,向誰傳遞之前 set 進去,
應用實體:
1、紅樓夢中的"擊鼓傳花",
2、JS 中的事件冒泡,
3、JAVA WEB 中 Apache Tomcat 對 Encoding 的處理,Struts2 的攔截器,jsp servlet 的 Filter,
優點:
1、降低耦合度,它將請求的發送者和接收者解耦,
2、簡化了物件,使得物件不需要知道鏈的結構,
3、增強給物件指派職責的靈活性,通過改變鏈內的成員或者調動它們的次序,允許動態地新增或者洗掉責任,
4、增加新的請求處理類很方便,
缺點:
1、不能保證請求一定被接收,
2、系統性能將受到一定影響,而且在進行代碼除錯時不太方便,可能會造成回圈呼叫,
3、可能不容易觀察運行時的特征,有礙于除錯,
使用場景:
1、有多個物件可以處理同一個請求,具體哪個物件處理該請求由運行時刻自動確定,
2、在不明確指定接收者的情況下,向多個物件中的一個提交一個請求,
3、可動態指定一組物件處理請求,
注意事項:在 JAVA WEB 中遇到很多應用,
命令模式(Command Pattern)
命令模式(Command Pattern)是一種資料驅動的設計模式,它屬于行為型模式,請求以命令的形式包裹在物件中,并傳給呼叫物件,呼叫物件尋找可以處理該命令的合適的物件,并把該命令傳給相應的物件,該物件執行命令,
意圖:將一個請求封裝成一個物件,從而使您可以用不同的請求對客戶進行引數化,
主要解決:在軟體系統中,行為請求者與行為實作者通常是一種緊耦合的關系,但某些場合,比如需要對行為進行記錄、撤銷或重做、事務等處理時,這種無法抵御變化的緊耦合的設計就不太合適,
何時使用:在某些場合,比如要對行為進行"記錄、撤銷/重做、事務"等處理,這種無法抵御變化的緊耦合是不合適的,在這種情況下,如何將"行為請求者"與"行為實作者"解耦?將一組行為抽象為物件,可以實作二者之間的松耦合,
如何解決:通過呼叫者呼叫接受者執行命令,順序:呼叫者→命令→接受者,
關鍵代碼:定義三個角色:
1、received 真正的命令執行物件
2、Command
3、invoker 使用命令物件的入口
應用實體:struts 1 中的 action 核心控制器 ActionServlet 只有一個,相當于 Invoker,而模型層的類會隨著不同的應用有不同的模型類,相當于具體的 Command,
優點:
1、降低了系統耦合度,
2、新的命令可以很容易添加到系統中去,
缺點:使用命令模式可能會導致某些系統有過多的具體命令類,
使用場景:認為是命令的地方都可以使用命令模式,比如: 1、GUI 中每一個按鈕都是一條命令, 2、模擬 CMD,
注意事項:系統需要支持命令的撤銷(Undo)操作和恢復(Redo)操作,也可以考慮使用命令模式,見命令模式的擴展,
命令模式結構示意圖:

解釋器模式(Interpreter Pattern)
解釋器模式(Interpreter Pattern)提供了評估語言的語法或運算式的方式,它屬于行為型模式,這種模式實作了一個運算式介面,該介面解釋一個特定的背景關系,這種模式被用在 SQL 決議、符號處理引擎等,
意圖:給定一個語言,定義它的文法表示,并定義一個解釋器,這個解釋器使用該標識來解釋語言中的句子,
主要解決:對于一些固定文法構建一個解釋句子的解釋器,
何時使用:如果一種特定型別的問題發生的頻率足夠高,那么可能就值得將該問題的各個實體表述為一個簡單語言中的句子,這樣就可以構建一個解釋器,該解釋器通過解釋這些句子來解決該問題,
如何解決:構建語法樹,定義終結符與非終結符,
關鍵代碼:構建環境類,包含解釋器之外的一些全域資訊,一般是 HashMap,
應用實體:編譯器、運算運算式計算,
優點:
1、可擴展性比較好,靈活,
2、增加了新的解釋運算式的方式,
3、易于實作簡單文法,
缺點:
1、可利用場景比較少,
2、對于復雜的文法比較難維護,
3、解釋器模式會引起類膨脹,
4、解釋器模式采用遞回呼叫方法,
使用場景:
1、可以將一個需要解釋執行的語言中的句子表示為一個抽象語法樹,
2、一些重復出現的問題可以用一種簡單的語言來進行表達,
3、一個簡單語法需要解釋的場景,
注意事項:可利用場景比較少,JAVA 中如果碰到可以用 expression4J 代替,
迭代器模式(Iterator Pattern)
迭代器模式(Iterator Pattern)是 Java 和 .Net 編程環境中非常常用的設計模式,這種模式用于順序訪問集合物件的元素,不需要知道集合物件的底層表示,
迭代器模式屬于行為型模式,
意圖:提供一種方法順序訪問一個聚合物件中各個元素, 而又無須暴露該物件的內部表示,
主要解決:不同的方式來遍歷整個整合物件,
何時使用:遍歷一個聚合物件,
如何解決:把在元素之間游走的責任交給迭代器,而不是聚合物件,
關鍵代碼:定義介面:hasNext, next,
應用實體:JAVA 中的 iterator,
優點:
1、它支持以不同的方式遍歷一個聚合物件,
2、迭代器簡化了聚合類,
3、在同一個聚合上可以有多個遍歷,
4、在迭代器模式中,增加新的聚合類和迭代器類都很方便,無須修改原有代碼,
缺點:由于迭代器模式將存盤資料和遍歷資料的職責分離,增加新的聚合類需要對應增加新的迭代器類,類的個數成對增加,這在一定程度上增加了系統的復雜性,
使用場景:
1、訪問一個聚合物件的內容而無須暴露它的內部表示,
2、需要為聚合物件提供多種遍歷方式,
3、為遍歷不同的聚合結構提供一個統一的介面,
注意事項:迭代器模式就是分離了集合物件的遍歷行為,抽象出一個迭代器類來負責,這樣既可以做到不暴露集合的內部結構,又可讓外部代碼透明地訪問集合內部的資料,
中介者模式(Mediator Pattern)
中介者模式(Mediator Pattern)是用來降低多個物件和類之間的通信復雜性,這種模式提供了一個中介類,該類通常處理不同類之間的通信,并支持松耦合,使代碼易于維護,中介者模式屬于行為型模式,
意圖:用一個中介物件來封裝一系列的物件互動,中介者使各物件不需要顯式地相互參考,從而使其耦合松散,而且可以獨立地改變它們之間的互動,
主要解決:物件與物件之間存在大量的關聯關系,這樣勢必會導致系統的結構變得很復雜,同時若一個物件發生改變,我們也需要跟蹤與之相關聯的物件,同時做出相應的處理,
何時使用:多個類相互耦合,形成了網狀結構,
如何解決:將上述網狀結構分離為星型結構,
關鍵代碼:物件 Colleague 之間的通信封裝到一個類中單獨處理,
應用實體:
1、中國加入 WTO 之前是各個國家相互貿易,結構復雜,現在是各個國家通過 WTO 來互相貿易,
2、機場調度系統,
3、MVC 框架,其中C(控制器)就是 M(模型)和 V(視圖)的中介者,
優點:
1、降低了類的復雜度,將一對多轉化成了一對一,
2、各個類之間的解耦,
3、符合迪米特原則,
缺點:中介者會龐大,變得復雜難以維護,
使用場景:
1、系統中物件之間存在比較復雜的參考關系,導致它們之間的依賴關系結構混亂而且難以復用該物件,
2、想通過一個中間類來封裝多個類中的行為,而又不想生成太多的子類,
注意事項:不應當在職責混亂的時候使用,
備忘錄模式(Memento Pattern)
備忘錄模式(Memento Pattern)保存一個物件的某個狀態,以便在適當的時候恢復物件,備忘錄模式屬于行為型模式,
意圖:在不破壞封裝性的前提下,捕獲一個物件的內部狀態,并在該物件之外保存這個狀態,
主要解決:所謂備忘錄模式就是在不破壞封裝的前提下,捕獲一個物件的內部狀態,并在該物件之外保存這個狀態,這樣可以在以后將物件恢復到原先保存的狀態,
何時使用:很多時候我們總是需要記錄一個物件的內部狀態,這樣做的目的就是為了允許用戶取消不確定或者錯誤的操作,能夠恢復到他原先的狀態,使得他有"后悔藥"可吃,
如何解決:通過一個備忘錄類專門存盤物件狀態,
關鍵代碼:客戶不與備忘錄類耦合,與備忘錄管理類耦合,
應用實體:
1、后悔藥,
2、打游戲時的存檔,
3、Windows 里的 ctrl + z,
4、IE 中的后退,
5、資料庫的事務管理,
優點:
1、給用戶提供了一種可以恢復狀態的機制,可以使用戶能夠比較方便地回到某個歷史的狀態,
2、實作了資訊的封裝,使得用戶不需要關心狀態的保存細節,
缺點:消耗資源,如果類的成員變數過多,勢必會占用比較大的資源,而且每一次保存都會消耗一定的記憶體,
使用場景:
1、需要保存/恢復資料的相關狀態場景,
2、提供一個可回滾的操作,
注意事項:
1、為了符合迪米特原則,還要增加一個管理備忘錄的類,
2、為了節約記憶體,可使用原型模式+備忘錄模式,
觀察者模式(Observer Pattern)
當物件間存在一對多關系時,則使用觀察者模式(Observer Pattern),比如,當一個物件被修改時,則會自動通知依賴它的物件,觀察者模式屬于行為型模式,
意圖:定義物件間的一種一對多的依賴關系,當一個物件的狀態發生改變時,所有依賴于它的物件都得到通知并被自動更新,
主要解決:一個物件狀態改變給其他物件通知的問題,而且要考慮到易用和低耦合,保證高度的協作,
何時使用:一個物件(目標物件)的狀態發生改變,所有的依賴物件(觀察者物件)都將得到通知,進行廣播通知,
如何解決:使用面向物件技術,可以將這種依賴關系榷訓,
關鍵代碼:在抽象類里有一個 ArrayList 存放觀察者們,
應用實體:
1、拍賣的時候,拍賣師觀察最高標價,然后通知給其他競價者競價,
2、西游記里面悟空請求菩薩降服紅孩兒,菩薩灑了一地水招來一個老烏龜,這個烏龜就是觀察者,他觀察菩薩灑水這個動作,
優點:
1、觀察者和被觀察者是抽象耦合的,
2、建立一套觸發機制,
缺點:
1、如果一個被觀察者物件有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間,
2、如果在觀察者和觀察目標之間有回圈依賴的話,觀察目標會觸發它們之間進行回圈呼叫,可能導致系統崩潰,
3、觀察者模式沒有相應的機制讓觀察者知道所觀察的目標物件是怎么發生變化的,而僅僅只是知道觀察目標發生了變化,
使用場景:
- 一個抽象模型有兩個方面,其中一個方面依賴于另一個方面,將這些方面封裝在獨立的物件中使它們可以各自獨立地改變和復用,
- 一個物件的改變將導致其他一個或多個物件也發生改變,而不知道具體有多少物件將發生改變,可以降低物件之間的耦合度,
- 一個物件必須通知其他物件,而并不知道這些物件是誰,
- 需要在系統中創建一個觸發鏈,A物件的行為將影響B物件,B物件的行為將影響C物件……,可以使用觀察者模式創建一種鏈式觸發機制,
注意事項:
1、JAVA 中已經有了對觀察者模式的支持類,
2、避免回圈參考,
3、如果順序執行,某一觀察者錯誤會導致系統卡殼,一般采用異步方式,
狀態模式(State Pattern)
在狀態模式(State Pattern)中,類的行為是基于它的狀態改變的,這種型別的設計模式屬于行為型模式,
在狀態模式中,我們創建表示各種狀態的物件和一個行為隨著狀態物件改變而改變的 context 物件,
意圖:允許物件在內部狀態發生改變時改變它的行為,物件看起來好像修改了它的類,
主要解決:物件的行為依賴于它的狀態(屬性),并且可以根據它的狀態改變而改變它的相關行為,
何時使用:代碼中包含大量與物件狀態有關的條件陳述句,
如何解決:將各種具體的狀態類抽象出來,
關鍵代碼:通常命令模式的介面中只有一個方法,而狀態模式的介面中有一個或者多個方法,而且,狀態模式的實作類的方法,一般回傳值,或者是改變實體變數的值,也就是說,狀態模式一般和物件的狀態有關,實作類的方法有不同的功能,覆寫介面中的方法,狀態模式和命令模式一樣,也可以用于消除 if...else 等條件選擇陳述句,
應用實體:
1、打籃球的時候運動員可以有正常狀態、不正常狀態和超常狀態,
2、曾侯乙編鐘中,'鐘是抽象介面','鐘A'等是具體狀態,'曾侯乙編鐘'是具體環境(Context),
優點:
1、封裝了轉換規則,
2、列舉可能的狀態,在列舉狀態之前需要確定狀態種類,
3、將所有與某個狀態有關的行為放到一個類中,并且可以方便地增加新的狀態,只需要改變物件狀態即可改變物件的行為,
4、允許狀態轉換邏輯與狀態物件合成一體,而不是某一個巨大的條件陳述句塊,
5、可以讓多個環境物件共享一個狀態物件,從而減少系統中物件的個數,
缺點:
1、狀態模式的使用必然會增加系統類和物件的個數,
2、狀態模式的結構與實作都較為復雜,如果使用不當將導致程式結構和代碼的混亂,
3、狀態模式對"開閉原則"的支持并不太好,對于可以切換狀態的狀態模式,增加新的狀態類需要修改那些負責狀態轉換的源代碼,否則無法切換到新增狀態,而且修改某個狀態類的行為也需修改對應類的源代碼,
使用場景:
1、行為隨狀態改變而改變的場景,
2、條件、分支陳述句的代替者,
注意事項:在行為受狀態約束的時候使用狀態模式,而且狀態不超過 5 個,
空物件模式(Null Object Pattern)
在空物件模式(Null Object Pattern)中,一個空物件取代 NULL 物件實體的檢查,Null 物件不是檢查空值,而是反應一個不做任何動作的關系,這樣的 Null 物件也可以在資料不可用的時候提供默認的行為,
在空物件模式中,我們創建一個指定各種要執行的操作的抽象類和擴展該類的物體類,還創建一個未對該類做任何實作的空物件類,該空物件類將無縫地使用在需要檢查空值的地方,
策略模式(Strategy Pattern)
在策略模式(Strategy Pattern)中,一個類的行為或其演算法可以在運行時更改,這種型別的設計模式屬于行為型模式,
在策略模式中,我們創建表示各種策略的物件和一個行為隨著策略物件改變而改變的 context 物件,策略物件改變 context 物件的執行演算法,
意圖:定義一系列的演算法,把它們一個個封裝起來, 并且使它們可相互替換,
主要解決:在有多種演算法相似的情況下,使用 if...else 所帶來的復雜和難以維護,
何時使用:一個系統有許多許多類,而區分它們的只是他們直接的行為,
如何解決:將這些演算法封裝成一個一個的類,任意地替換,
關鍵代碼:實作同一個介面,
應用實體:
1、諸葛亮的錦囊妙計,每一個錦囊就是一個策略,
2、旅行的出游方式,選擇騎自行車、坐汽車,每一種旅行方式都是一個策略,
3、JAVA AWT 中的 LayoutManager,
優點:
1、演算法可以自由切換,
2、避免使用多重條件判斷,
3、擴展性良好,
缺點:
1、策略類會增多,
2、所有策略類都需要對外暴露,
使用場景:
1、如果在一個系統里面有許多類,它們之間的區別僅在于它們的行為,那么使用策略模式可以動態地讓一個物件在許多行為中選擇一種行為,
2、一個系統需要動態地在幾種演算法中選擇一種,
3、如果一個物件有很多的行為,如果不用恰當的模式,這些行為就只好使用多重的條件選擇陳述句來實作,
注意事項:如果一個系統的策略多于四個,就需要考慮使用混合模式,解決策略類膨脹的問題,
模板模式(Template Pattern)
在模板模式(Template Pattern)中,一個抽象類公開定義了執行它的方法的方式/模板,它的子類可以按需要重寫方法實作,但呼叫將以抽象類中定義的方式進行,這種型別的設計模式屬于行為型模式,
意圖:定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟,
主要解決:一些方法通用,卻在每一個子類都重新寫了這一方法,
何時使用:有一些通用的方法,
如何解決:將這些通用演算法抽象出來,
關鍵代碼:在抽象類實作,其他步驟在子類實作,
應用實體:
1、在造房子的時候,地基、走線、水管都一樣,只有在建筑的后期才有加壁櫥加柵欄等差異,
2、西游記里面菩薩定好的 81 難,這就是一個頂層的邏輯骨架,
3、spring 中對 Hibernate 的支持,將一些已經定好的方法封裝起來,比如開啟事務、獲取 Session、關閉 Session 等,程式員不重復寫那些已經規范好的代碼,直接丟一個物體就可以保存,
優點:
1、封裝不變部分,擴展可變部分,
2、提取公共代碼,便于維護,
3、行為由父類控制,子類實作,
缺點:每一個不同的實作都需要一個子類來實作,導致類的個數增加,使得系統更加龐大,
使用場景:
1、有多個子類共有的方法,且邏輯相同,
2、重要的、復雜的方法,可以考慮作為模板方法,
注意事項:為防止惡意操作,一般模板方法都加上 final 關鍵詞,
訪問者模式(Visitor Pattern)
在訪問者模式(Visitor Pattern)中,我們使用了一個訪問者類,它改變了元素類的執行演算法,通過這種方式,元素的執行演算法可以隨著訪問者改變而改變,這種型別的設計模式屬于行為型模式,根據模式,元素物件已接受訪問者物件,這樣訪問者物件就可以處理元素物件上的操作,
意圖:主要將資料結構與資料操作分離,
主要解決:穩定的資料結構和易變的操作耦合問題,
何時使用:需要對一個物件結構中的物件進行很多不同的并且不相關的操作,而需要避免讓這些操作"污染"這些物件的類,使用訪問者模式將這些封裝到類中,
如何解決:在被訪問的類里面加一個對外提供接待訪問者的介面,
關鍵代碼:在資料基礎類里面有一個方法接受訪問者,將自身參考傳入訪問者,
應用實體:您在朋友家做客,您是訪問者,朋友接受您的訪問,您通過朋友的描述,然后對朋友的描述做出一個判斷,這就是訪問者模式,
優點:
1、符合單一職責原則,
2、優秀的擴展性,
3、靈活性,
缺點:
1、具體元素對訪問者公布細節,違反了迪米特原則,
2、具體元素變更比較困難,
3、違反了依賴倒置原則,依賴了具體類,沒有依賴抽象,
使用場景:
1、物件結構中物件對應的類很少改變,但經常需要在此物件結構上定義新的操作,
2、需要對一個物件結構中的物件進行很多不同的并且不相關的操作,而需要避免讓這些操作"污染"這些物件的類,也不希望在增加新操作時修改這些類,
注意事項:訪問者可以對功能進行統一,可以做報表、UI、攔截器與過濾器,
MVC 模式(MVC Pattern)
MVC 模式代表 Model-View-Controller(模型-視圖-控制器) 模式,這種模式用于應用程式的分層開發,
- Model(模型) - 模型代表一個存取資料的物件或 JAVA POJO,它也可以帶有邏輯,在資料變化時更新控制器,
- View(視圖) - 視圖代表模型包含的資料的可視化,
- Controller(控制器) - 控制器作用于模型和視圖上,它控制資料流向模型物件,并在資料變化時更新視圖,它使視圖與模型分離開,

業務代表模式(Business Delegate Pattern)
業務代表模式(Business Delegate Pattern)用于對表示層和業務層解耦,它基本上是用來減少通信或對表示層代碼中的業務層代碼的遠程查詢功能,在業務層中我們有以下物體,
- 客戶端(Client) - 表示層代碼可以是 JSP、servlet 或 UI java 代碼,
- 業務代表(Business Delegate) - 一個為客戶端物體提供的入口類,它提供了對業務服務方法的訪問,
- 查詢服務(LookUp Service) - 查找服務物件負責獲取相關的業務實作,并提供業務物件對業務代表物件的訪問,
- 業務服務(Business Service) - 業務服務介面,實作了該業務服務的物體類,提供了實際的業務實作邏輯,
組合物體模式(Composite Entity Pattern)
組合物體模式(Composite Entity Pattern)用在 EJB 持久化機制中,一個組合物體是一個 EJB 物體 bean,代表了物件的圖解,當更新一個組合物體時,內部依賴物件 beans 會自動更新,因為它們是由 EJB 物體 bean 管理的,以下是組合物體 bean 的參與者,
- 組合物體(Composite Entity) - 它是主要的物體 bean,它可以是粗粒的,或者可以包含一個粗粒度物件,用于持續生命周期,
- 粗粒度物件(Coarse-Grained Object) - 該物件包含依賴物件,它有自己的生命周期,也能管理依賴物件的生命周期,
- 依賴物件(Dependent Object) - 依賴物件是一個持續生命周期依賴于粗粒度物件的物件,
- 策略(Strategies) - 策略表示如何實作組合物體,
資料訪問物件模式(Data Access Object Pattern)
資料訪問物件模式(Data Access Object Pattern)或 DAO 模式用于把低級的資料訪問 API 或操作從高級的業務服務中分離出來,以下是資料訪問物件模式的參與者,
- 資料訪問物件介面(Data Access Object Interface) - 該介面定義了在一個模型物件上要執行的標準操作,
- 資料訪問物件物體類(Data Access Object concrete class) - 該類實作了上述的介面,該類負責從資料源獲取資料,資料源可以是資料庫,也可以是 xml,或者是其他的存盤機制,
- 模型物件/數值物件(Model Object/Value Object) - 該物件是簡單的 POJO,包含了 get/set 方法來存盤通過使用 DAO 類檢索到的資料,
前端控制器模式(Front Controller Pattern)
前端控制器模式(Front Controller Pattern)是用來提供一個集中的請求處理機制,所有的請求都將由一個單一的處理程式處理,該處理程式可以做認證/授權/記錄日志,或者跟蹤請求,然后把請求傳給相應的處理程式,以下是這種設計模式的物體,
- 前端控制器(Front Controller) - 處理應用程式所有型別請求的單個處理程式,應用程式可以是基于 web 的應用程式,也可以是基于桌面的應用程式,
- 調度器(Dispatcher) - 前端控制器可能使用一個調度器物件來調度請求到相應的具體處理程式,
- 視圖(View) - 視圖是為請求而創建的物件,
攔截過濾器模式(Intercepting Filter Pattern)
攔截過濾器模式(Intercepting Filter Pattern)用于對應用程式的請求或回應做一些預處理/后處理,定義過濾器,并在把請求傳給實際目標應用程式之前應用在請求上,過濾器可以做認證/授權/記錄日志,或者跟蹤請求,然后把請求傳給相應的處理程式,以下是這種設計模式的物體,
- 過濾器(Filter) - 過濾器在請求處理程式執行請求之前或之后,執行某些任務,
- 過濾器鏈(Filter Chain) - 過濾器鏈帶有多個過濾器,并在 Target 上按照定義的順序執行這些過濾器,
- Target - Target 物件是請求處理程式,
- 過濾管理器(Filter Manager) - 過濾管理器管理過濾器和過濾器鏈,
- 客戶端(Client) - Client 是向 Target 物件發送請求的物件,
服務定位器模式(Service Locator Pattern)
服務定位器模式(Service Locator Pattern)用在我們想使用 JNDI 查詢定位各種服務的時候,考慮到為某個服務查找 JNDI 的代價很高,服務定位器模式充分利用了快取技術,在首次請求某個服務時,服務定位器在 JNDI 中查找服務,并快取該服務物件,當再次請求相同的服務時,服務定位器會在它的快取中查找,這樣可以在很大程度上提高應用程式的性能,以下是這種設計模式的物體,
- 服務(Service) - 實際處理請求的服務,對這種服務的參考可以在 JNDI 服務器中查找到,
- Context / 初始的 Context - JNDI Context 帶有對要查找的服務的參考,
- 服務定位器(Service Locator) - 服務定位器是通過 JNDI 查找和快取服務來獲取服務的單點接觸,
- 快取(Cache) - 快取存盤服務的參考,以便復用它們,
- 客戶端(Client) - Client 是通過 ServiceLocator 呼叫服務的物件,
傳輸物件模式(Transfer Object Pattern)
傳輸物件模式(Transfer Object Pattern)用于從客戶端向服務器一次性傳遞帶有多個屬性的資料,傳輸物件也被稱為數值物件,傳輸物件是一個具有 getter/setter 方法的簡單的 POJO 類,它是可序列化的,所以它可以通過網路傳輸,它沒有任何的行為,服務器端的業務類通常從資料庫讀取資料,然后填充 POJO,并把它發送到客戶端或按值傳遞它,對于客戶端,傳輸物件是只讀的,客戶端可以創建自己的傳輸物件,并把它傳遞給服務器,以便一次性更新資料庫中的數值,以下是這種設計模式的物體,
- 業務物件(Business Object) - 為傳輸物件填充資料的業務服務,
- 傳輸物件(Transfer Object) - 簡單的 POJO,只有設定/獲取屬性的方法,
- 客戶端(Client) - 客戶端可以發送請求或者發送傳輸物件到業務物件,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/458150.html
標籤:其他
上一篇:行為型:三. 命令模式
下一篇:系統架構的11條原則
