本文介紹設(shè)計(jì)模式中的外觀(Facade)模式的概念,用法,以及實(shí)際應(yīng)用中怎么樣使用Facade模式進(jìn)行開發(fā)。
Facade模式的概念
Facade模式為一組具有類似功能的類群,比如類庫,子系統(tǒng)等等,提供一個(gè)一致的簡(jiǎn)單的界面。這個(gè)一致的簡(jiǎn)單的界面被稱作facade。
在應(yīng)用系統(tǒng)中,為了實(shí)現(xiàn)某具有復(fù)雜功能的模塊或子系統(tǒng)等時(shí),往往需要為其設(shè)計(jì)和實(shí)現(xiàn)很多很小的類,也就是說,該模塊或子系統(tǒng)是由一組具有類似功能的類群組合而成。這樣一來,怎么調(diào)用這些類就成了問題。Facade就是這樣一種模式,設(shè)計(jì)一個(gè)被稱為facade的類,該類提供一個(gè)簡(jiǎn)單的調(diào)用接口:
- 隱藏具體的實(shí)現(xiàn)細(xì)節(jié),簡(jiǎn)化調(diào)用關(guān)系。
- 使得調(diào)用方的代碼更加簡(jiǎn)潔明了。
- 通過facade,降低外部調(diào)用類與內(nèi)部被調(diào)用類間的耦合程度。
- 可以為每個(gè)不同的任務(wù)需要,準(zhǔn)備經(jīng)過良好設(shè)計(jì)的簡(jiǎn)易的API。
Facade模式可以用下面的類圖來表示:
[出自:維基百科wikipedia.org]
Facade 為調(diào)用方定義簡(jiǎn)單的調(diào)用接口。
Clients 調(diào)用者。通過Facade接口調(diào)用提供某功能的內(nèi)部類群。
Packages 功能提供者。指提供功能的類群(模塊或子系統(tǒng))。
Facade模式與Adapter模式的區(qū)別
Facade模式與Adapter模式存在著相當(dāng)?shù)南嗨浦帲簽榧创娴念愄峁┙缑娼y(tǒng)一的接口,以供外部類調(diào)用。
但Facade模式的目的是簡(jiǎn)化調(diào)用關(guān)系;Adapter模式是為不同的模塊/子系統(tǒng)提供一個(gè)統(tǒng)一的接口(支持多態(tài)),旨在將一個(gè)或多個(gè)已經(jīng)存在的不統(tǒng)一的接口轉(zhuǎn)化成為另一個(gè)統(tǒng)一的接口。
舉例說明:
1,Adapter模式:
有銀行A系統(tǒng),銀行B系統(tǒng),它們具有大致一樣的功能,但它們的對(duì)外接口各不一樣。
如果需要在C系統(tǒng)中使用A系統(tǒng)或B系統(tǒng),為了接口的一致,我們需要在C系統(tǒng)中實(shí)現(xiàn)一個(gè)Adapter,通過這個(gè)Adapter提供的接口,我們就可以透明的調(diào)用銀行A系統(tǒng)的功能、或者銀行B系統(tǒng)的功能了;
2,F(xiàn)acade模式:
有銀行A系統(tǒng),它具有非常復(fù)雜的功能,有融資,貸款,存款,取款,信用審查,擔(dān)保等等功能,
如果需要在C系統(tǒng)中,只需用到A系統(tǒng)的一部分功能,比如融資,我們就可以為需要用到的融資功能封裝一個(gè)Facade,通過這個(gè)facade,我們不用管A系統(tǒng)的內(nèi)部是怎么實(shí)現(xiàn)融資業(yè)務(wù)的,也不用管信用審查是否通過,是否具有充分的擔(dān)保資源等等,大大簡(jiǎn)化了客戶端的調(diào)用。
Facade模式的模型:
A系統(tǒng)有A1, A2, A3等類??蛻舳诵枰{(diào)用A系統(tǒng)的的A1.doSomething1();A2.doSomething2();A3.doSomething3()來完成某功能。
Facade模式的實(shí)現(xiàn)模型就是:
A系統(tǒng):
class A1 {
public void doSomething1();
}
class A2 {
public void doSomething2();
}
class A3 {
public void doSomething3();
}
Facade:
public class Facade {
public void doSomething() {
A1 a1 = new A1();
A1 a2 = new A2();
A1 a3 = new A3();
a1.doSomething1();
a2.doSomething2();
a3.doSomething3();
}
}
Test:
public class Client {
public static void main(String []args) {
Facade facade = new Facade();
facade.doSomething();
}
}