我學設計模式 之 門面模式
我學設計模式之門面模式
1. 簡介
門面模式說物件的結構模式。外部與一個子系統的通訊必須通過一個系統的一個門面物件進行,這就是門面模式。門面模式也成為外觀模式、正面模式。
這個模式在系統中經常被用到,也是一個比較簡單的模式。
2. 門面模式的結構
Façade的UML圖如下:
門面模式主要由以下幾個角色:
門面角色:客戶端可以呼叫這個角色方法,此角色知曉相關的(一個或多個)子系統的功能和責任。本角色會將所有從客戶端發來的請求委派到相應的子系統去。
子系統角色:可以同時有一個或多個子系統。每一個子系統都不是一個單獨的類,而是一些類的集合。每一個子系統都可以被客戶端直接呼叫,或被門面角色呼叫。子系統並不知道門面的存在,對於子系統而言,門面僅僅是另一個客戶端而已。
3. 門面模式的用法
這個模式比較簡單,相信大家一般也都用過。舉一個簡單的例子:
服務類A/B/C如下:
package com.zsw.facade;
public class ServiceA { public void methodA(){ System.out.println("方法A"); } } |
package com.zsw.facade;
public class ServiceB { public void methodB(){ System.out.println("方法B"); } } |
package com.zsw.facade;
public class ServiceC { public void methodC(){ System.out.println("方法C"); } } |
門面類:
package com.zsw.facade;
public class Facade { private ServiceA serviceA; private ServiceB serviceB; private ServiceC serviceC;
public Facade(){ serviceA = new ServiceA(); serviceB = new ServiceB(); serviceC = new ServiceC(); }
public void methodA(){ serviceB.methodB(); serviceC.methodC(); }
public void methodB(){ serviceA.methodA(); serviceC.methodC(); }
public void methodC(){ serviceA.methodA(); serviceB.methodB(); } } |
客戶端:
package com.zsw.facade;
public class Client { public static void main(String[] args) { Facade facade = new Facade(); facade.methodA(); facade.methodB(); facade.methodC(); } }
|
4. 門面模式的應用場景
ü 為一個複雜子系統提供一個簡單的介面。
子系統往往以為不斷的演化而變得越來越複雜,使用門面模式可以使得子系統更具可複用性。Façade模式可以提供一個簡單的模式預設檢視,對於大多數使用者來說這個檢視已經足夠用了,而那些需要進一步繼承的使用者可以越過Façade層直接對系統 進行繼承。
ü 子系統的獨立性
一般而言,子系統和其他子系統之間、客戶端與實現化層之間存在著很大的依賴性。使用Façade模式將一個子系統與它的客戶端以及其他的子系統分離,可以提高系統的獨立性和可移植性。
ü 層次化結構
在構建一個層次化系統時,可以使用Façade模式來定義每一層的入口。如果層與層之間是相互依賴的,則可以限定他們通過Façade進行通訊,從而簡化了層之間的依賴關係。
ü 在Spring當中,也可以認為HibernateTemplate是SessionFactory、Session、Query等類的門面類,當客戶單需要進行持久化查詢時,程式無需呼叫這些類,而是直接呼叫HibernateTemplate門面類的方法即可。
ü 在設計階段,應該有意識的將不同的兩個層分離。比如經典的三層架構,就是需要考慮資料訪問從和業務邏輯層、業務層和表示層的層與層之間建立外觀Façade,這樣可以為複雜的子系統提供一個簡單的介面,是的耦合度大大降低。
ü 在開發階段,子系統往往因為不斷的重構演化而變得越來越複雜,大多數模式使用時也都會產生很多很小的類,這本是件好事,但也給外部呼叫它們的使用者程式帶來了使用上的困難,增加外觀Façade可以提供一個簡單的介面,減少它們之間的依賴。
ü 在維護一個遺留的大系統時,可能這個系統已經非常難以維護和擴充套件了,但他們包含非常重要的功能,新的需求開發必須依賴於它。此時用外觀模式Façade也是非常合適的。你可以為新系統開發一個外觀Façade類,來提供設計粗糙或高度複雜的遺留程式碼的比較清晰簡單的介面,讓新系統與Façade物件互動,Façade與遺留程式碼互動所有複雜的工作。
5. 門面模式的優缺點
a) 為一個複雜子系統提供一個簡單的介面。
b) 子系統的獨立性
c) 是層次結構化
d) 減少依賴、降低耦合度
6. 參考文件
《Java與模式》
《大話設計模式》
待續……………..
相關文章
- 設計模式之門面模式設計模式
- 設計模式之【門面模式(外觀模式)】設計模式
- Java設計模式之(九)——門面模式Java設計模式
- 23種設計模式(十二)介面隔離之門面模式設計模式
- 設計模式開門之單例模式設計模式單例
- 遺失得 Laravel 設計模式-門面模式Laravel設計模式
- 《我是面試官》設計模式-單例模式面試設計模式單例
- java23種設計模式-門面模式(外觀模式)Java設計模式
- Java學設計模式之享元模式Java設計模式
- 設計模式學習之單例模式設計模式單例
- 設計模式學習之訪問者模式設計模式
- 跟著GPT學設計模式之代理模式GPT設計模式
- Java學設計模式之責任鏈模式Java設計模式
- Java學設計模式之裝飾器模式Java設計模式
- Android面試之Java設計模式Android面試Java設計模式
- 小學生學習設計模式之單例模式設計模式單例
- 設計模式之策略模式設計模式
- 設計模式之代理模式設計模式
- 設計模式之Plugin模式設計模式Plugin
- 《設計模式》之代理模式設計模式
- 設計模式之命令模式設計模式
- 設計模式之-命令模式設計模式
- 設計模式之【策略模式】設計模式
- 設計模式之單例設計模式設計模式單例
- 設計模式學習筆記之工廠模式設計模式筆記
- 每天學點設計模式之---介面卡模式設計模式
- 跟著GPT學設計模式之橋接模式GPT設計模式橋接
- 設計模式之狀態模式(三分鐘學會一個設計模式)設計模式
- 設計模式之模板方法模式(三分鐘學會一個設計模式)設計模式
- 入門設計模式之彙總篇設計模式
- rxjs入門4之rxjs模式設計JS模式
- 設計模式入門:原型模式設計模式原型
- 一.設計模式之工廠設計模式設計模式
- JavaScript設計模式之建立型設計模式JavaScript設計模式
- Javascript設計模式之代理模式JavaScript設計模式
- Java設計模式之builder模式Java設計模式UI
- 設計模式之單例模式設計模式單例
- PHP 設計模式之策略模式PHP設計模式
- python設計模式之策略模式Python設計模式