1、簡介java
外觀模式(Facade),隱藏內部各子系統的細節與複雜性,向客戶端提供一個同一的調用接口,使得複雜系統易於被訪問和使用。spa
外觀模式,簡單點講就是把複雜的各個子系統組合成一個接口,提供給客戶使用。如上圖,主要涉及3個重要角色:3d
一、子系統角色:實現子系統的邏輯功能。對於客戶端來講是未知的,子系統之間能夠有交互。blog
二、門戶角色:核心角色。供客戶端調用,熟悉內部子系統功能。根據客戶需求對子系統進行功能對組合,抽象爲一個接口。接口
三、客戶角色:經過調用Facade接口來完成要實現的功能it
2、實戰class
假設有一棟別墅,裏面有不少門,好比臥室門、大廳門、廚房門,主人出遠門以前必需要把這些門關上,通常的作法就是一個一個關上,若是採用外觀模式,能夠提供一個總開關,統一對全部門進行開關控制。擴展
首先定義一個關門操做的接口:方法
public interface Door { public void closeDoor(); }
臥室門、大廳門、廚房門分別建立一個類,實現Door接口:im
public class BedroomDoor implements Door { public void closeDoor() { System.out.println("closing bedroom door."); } }
public class KitchenDoor implements Door { public void closeDoor() { System.out.println("closing kitchen door."); } }
public class HallDoor implements Door { public void closeDoor() { System.out.println("closing hall door."); } }
門面類,對各類門的關門操做進行組合或者合併,只提供惟一的接口
public class DoorFacade { Door bd = new BedroomDoor(); Door kd = new KitchenDoor(); Door hd = new HallDoor(); public void closeDoor() { bd.closeDoor(); kd.closeDoor(); hd.closeDoor(); } }
客戶端,經過調用門面類的接口便可將全部的門關閉
public class Client { public static void main(String[] args) { DoorFacade facade = new DoorFacade(); facade.closeDoor(); } }
運行結果:
3、優勢
一、鬆散耦合:使得客戶端和子系統之間解耦,讓子系統內部的模塊功能更容易擴展和維護;
二、簡單易用:客戶端根本不須要知道子系統內部的實現,或者根本不須要知道子系統內部的構成,它只須要跟Facade類交互便可;
三、更好地劃分訪問層次:有些方法是對系統外的,有些方法是系統內部相互交互的使用的。子系統把那些暴露給外部的功能集中到門面中,這樣就能夠實現客戶端的使用,很好的隱藏了子系 統內部的細節。