在《設(shè)計模式》一書中,F(xiàn)acade模式的意圖是:為子系統(tǒng)中的一組接口提供一個統(tǒng)一接口,F(xiàn)acade模式定義了一個更高層的接口,使子系統(tǒng)更加容易使用。
Facade模式的UML圖如下所示:
如圖所示,F(xiàn)acade向下調(diào)用SubSystem所提供的功能(并非全部功能,而是部分功能)。TargetSystem則通過Facade提供的接口來調(diào)用SubSystem所提供的功能。這樣TargetSystem無需知道SubSystem所提供的所有功能及其細(xì)節(jié),只需知道Facade所提供的接口即可。Facade存在的目的就是為TargetSystem提供更簡單的接口。
Facade的使用非常普遍。比如在調(diào)用第三方軟件庫時,一般不會用到該軟件庫所提供的所有的接口,而是使用一個Facade類,來包裝我們所用到的接口。然后在程序中直接調(diào)用Facade所提供的接口即可。
下圖是一個調(diào)用dom4j的Facade的例子。

在XmlFacade中,會使用到Document、Element和Attribute三個由dom4j所使用到的類/接口,而不使用其他dom4j提供的接口。這樣在BusinessClass中只需要調(diào)用XmlFacade中所提供的接口即可。
同時,F(xiàn)acade模式還能減少客戶所需要處理的對象數(shù)量。比如在上圖中,假設(shè)有2個BusinessClass,而這兩個BusinessClass都需要調(diào)用Document、Element和Attribute。如果沒有XmlFacade類,那么這兩個BusinessClass都需要分別new一個Document、Element和Attribute類。這樣,就需要生成一共6個新實例(Document、Element和Attribute類每個分別為2個)。如果通過XmlFacade類,則每個Document、Element和Attribute類僅需要一個實例,也就是一共需要3個新的實例而已。