Facade 模式概述及作用
作用
Facade(外觀)模式為子系統(tǒng)中的各類(或結(jié)構(gòu)與方法)提供一個簡明一致的界面,隱藏子系統(tǒng)的復(fù)雜性,使子系統(tǒng)更加容易使用。
概述
實(shí)際應(yīng)用中,我們在對付一些老舊的系統(tǒng),或者即便不是老舊系統(tǒng),但涉及多個子系統(tǒng)時(shí),除了重寫全部代碼,我們還可能采用這樣一種策略:重新進(jìn)行類的設(shè)計(jì),將原來分散在源碼中的類/結(jié)構(gòu)及方法重新組合,形成新的、統(tǒng)一的接口,供上層應(yīng)用使用。
區(qū)別
從上概述中可見,在某種意義上Facade與Adapter及Proxy有類似之處,但是,Proxy注重在為Client-Subject提供一個訪問的中間層,如CORBA可為應(yīng)用程序提供透明訪問支持,使應(yīng)用程序無需去考慮平臺及網(wǎng)絡(luò)造成的差異及其它諸多技術(shù)細(xì)節(jié);Adapter注重對接口的轉(zhuǎn)換與調(diào)整(接口適配器模式);而Facade所面對的往往是多個類或其它程序單元,通過重新組合各類及程序單元,對外提供統(tǒng)一的接口/界面(其實(shí)和對象Adapter設(shè)計(jì)模式的區(qū)別微乎其微)。
Facade模式的適用場景
1、當(dāng)你要為一個復(fù)雜子系統(tǒng)提供一個簡單接口時(shí)。子系統(tǒng)往往因?yàn)椴粩嘌莼兊迷絹碓綇?fù)雜。大多數(shù)模式使用時(shí)都會產(chǎn)生更多更小的類。這使得子系統(tǒng)更具可重用性,也更容易對子系統(tǒng)進(jìn)行定制,但這也給那些不需要定制子系統(tǒng)的用戶帶來一些使用上的困難。Facade可以提供一個簡單的缺省視圖,這一視圖對大多數(shù)用戶來說已經(jīng)足夠,而那些需要更多的可定制性的用戶可以越過Facade層。
2、客戶程序與抽象類的實(shí)現(xiàn)部分之間存在著很大的依賴性。引入Facade將這個子系統(tǒng)與客戶以及其他的子系統(tǒng)分離,可以提高子系統(tǒng)的獨(dú)立性和可移植性。
3、當(dāng)你需要構(gòu)建一個層次結(jié)構(gòu)的子系統(tǒng)時(shí),使用Facade模式定義子系統(tǒng)中每層的入口點(diǎn),如果子系統(tǒng)之間是相互依賴的,你可以讓它們僅通過Facade 進(jìn)行通訊,從而簡化了它們之間的依賴關(guān)系。
UML圖
代碼
public interface ServiceA {
public void methodA() ;
}
public class ServiceAImpl implements ServiceA {
@Override
public void methodA() {
System.out.println( "methodA--> is runing" );
}
}
public interface ServiceB {
public void methodB() ;
}
public class ServiceBImpl implements ServiceB {
@Override
public void methodB() {
System.out.println( "methodB--> is runing" );
}
}
public interface ServiceC {
public void methodC() ;
}
public class ServiceCImpl implements ServiceC {
@Override
public void methodC() {
System.out.println( "methodC--> is runing" );
}
}
/**
* 外觀模式 核心類
* */
public class Facade {
ServiceA sa;
ServiceB sb;
ServiceC sc;
public Facade() {
sa = new ServiceAImpl();
sb = new ServiceBImpl();
sc = new ServiceCImpl();
}
public void methodA() {
sa.methodA();
sb.methodB();
}
public void methodB() {
sb.methodB();
sc.methodC();
}
public void methodC() {
sc.methodC();
sa.methodA();
}
}
public class Client {
public static void main(String[] args) {
Facade f = new Facade();
f.methodA();
f.methodB();
f.methodC();
}
}
Facade模式的優(yōu)缺點(diǎn)
1、它對客戶屏蔽子系統(tǒng)組件,因而減少了客戶處理的對象的數(shù)目并使得子系統(tǒng)使用起來更加方便。
2、它實(shí)現(xiàn)了子系統(tǒng)與客戶之間的松耦合關(guān)系,而子系統(tǒng)內(nèi)部的功能組件往往是緊耦合的。松耦合關(guān)系使得子系統(tǒng)的組件變化不會影響到它的客戶。Facade模式有助于建立層次結(jié)構(gòu)系統(tǒng),也有助于對對象之間的依賴關(guān)系分層。Facade模式可以消除復(fù)雜的循環(huán)依賴關(guān)系。這一點(diǎn)在客戶程序與子系統(tǒng)是分別實(shí)現(xiàn)的時(shí)候尤為重要。在大型軟件系統(tǒng)中降低編譯依賴性至關(guān)重要。在子系統(tǒng)類改變時(shí),希望盡量減少重編譯工作以節(jié)省時(shí)間。用Facade可以降低編譯依賴性,限制重要系統(tǒng)中較小的變化所需的重編譯工作。Facade模式同樣也有利于簡化系統(tǒng)在不同平臺之間的移植過程,因?yàn)榫幾g一個子系統(tǒng)一般不需要編譯所有其他的子系統(tǒng)。
3、如果應(yīng)用需要,它并不限制它們使用子系統(tǒng)類。因此你可以在系統(tǒng)易用性和通用性之間加以選擇。