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

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