我學設計模式 之 門面模式

sz_bdqn發表於2010-09-22

我學設計模式之門面模式

 

1.       簡介

門面模式說物件的結構模式。外部與一個子系統的通訊必須通過一個系統的一個門面物件進行,這就是門面模式。門面模式也成為外觀模式、正面模式。

這個模式在系統中經常被用到,也是一個比較簡單的模式。

 

2.       門面模式的結構

FaçadeUML圖如下:

 

 

門面模式主要由以下幾個角色:

門面角色:客戶端可以呼叫這個角色方法,此角色知曉相關的(一個或多個)子系統的功能和責任。本角色會將所有從客戶端發來的請求委派到相應的子系統去。

 

子系統角色:可以同時有一個或多個子系統。每一個子系統都不是一個單獨的類,而是一些類的集合。每一個子系統都可以被客戶端直接呼叫,或被門面角色呼叫。子系統並不知道門面的存在,對於子系統而言,門面僅僅是另一個客戶端而已。

 

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當中,也可以認為HibernateTemplateSessionFactorySessionQuery等類的門面類,當客戶單需要進行持久化查詢時,程式無需呼叫這些類,而是直接呼叫HibernateTemplate門面類的方法即可。

ü         在設計階段,應該有意識的將不同的兩個層分離。比如經典的三層架構,就是需要考慮資料訪問從和業務邏輯層、業務層和表示層的層與層之間建立外觀Façade,這樣可以為複雜的子系統提供一個簡單的介面,是的耦合度大大降低。

ü         在開發階段,子系統往往因為不斷的重構演化而變得越來越複雜,大多數模式使用時也都會產生很多很小的類,這本是件好事,但也給外部呼叫它們的使用者程式帶來了使用上的困難,增加外觀Façade可以提供一個簡單的介面,減少它們之間的依賴。

ü         在維護一個遺留的大系統時,可能這個系統已經非常難以維護和擴充套件了,但他們包含非常重要的功能,新的需求開發必須依賴於它。此時用外觀模式Façade也是非常合適的。你可以為新系統開發一個外觀Façade類,來提供設計粗糙或高度複雜的遺留程式碼的比較清晰簡單的介面,讓新系統與Façade物件互動,Façade與遺留程式碼互動所有複雜的工作。

 

 

5.       門面模式的優缺點

a)         為一個複雜子系統提供一個簡單的介面。

b)        子系統的獨立性

c)        是層次結構化

d)        減少依賴、降低耦合度

 

 

6.       參考文件

Java與模式》

《大話設計模式》

 

待續……………..

 

 

相關文章