本文源碼見:https://github.com/get-set/get-designpatterns/tree/master/facadejava
門面模式(Facade Pattern)用於隱藏系統的複雜性,並向客戶端提供一些簡化訪問方法和對現有系統類方法的委託調用。這種類型的設計模式屬於結構型模式,用來隱藏系統的複雜性。git
如今政府辦事愈來愈方便了,不少城市、區縣都有統一的辦事大廳,裏邊有各個部門的窗口,通常進去一圈該辦的事情就齊活了。想一想以前,政府辦個事情,這個部門蓋個章,那個部門開個證實,不一樣的部門分散在城市的不一樣位置,一天有時候都辦不穩當。先爲這種進步點個贊!github
各個部門還在各自的地方,可是都會在辦事大廳開一個窗口。其實這個辦事大廳就至關於各個部門的一個總的門面,就是用到了「門面模式」。咱們如今的系統一般會愈來愈複雜,類之間的依賴調用關係逐漸變複雜,接口愈來愈多,這時候一般會用一個專門的類對某個模塊或子系統進行一個包裝,歸置歸置,簡化對外提供服務的方法調用,較少方法數量。設計模式
很久沒有用那個畫圖的例子了,這裏再次搬出來。對於門面模式來講,沒有固化的類關係模型,一切以簡化和封裝爲出發點,因此這個例子也比較簡潔,領會意思便可。ide
這個例子中,有圓形、矩形和三角形三種形狀,它們都繼承自Shape
:設計
# Shape.java public interface Shape { void draw(); } # Circle.java public class Circle implements Shape { public void draw() { System.out.println("Draw a circle."); } } # Rectangle.java public class Rectangle implements Shape { public void draw() { System.out.println("Draw a ectangle."); } } # Triangle.java public class Triangle implements Shape{ public void draw() { System.out.println("Draw a triangle."); } }
隨着形狀的增多,類數量也會顯著增長,這個時候若是有一個統一的類來提供各個圖形的draw
功能就行了。咱們以前用這個例子解釋過工廠模式,工廠模式主要是用來獲取類實例的,而門面模式是統一對外提供接口調用的。本例的門面類以下:代理
ShapeDrawer.javacode
public class ShapeDrawer { private ShapeDrawer() {} public static void drawCircle() { new Circle().draw(); } public static void drawTrangle() { new Triangle().draw(); } public static void drawRectangle() { new Rectangle().draw(); } }
這裏,ShapeDrawer
是做爲類來使用了,由於其方法都是static
的,所以也就不用建立其對象,因此構造方法聲明爲私有的。使用時直接調用靜態方法便可:ShapeDrawer.drawCircle();
。對象
固然,這只是一種方式,並非說門面模式就要這樣作。繼承
門面模式更可能是一種設計思想,而不是具體模型。目的是爲子系統中的一組接口提供一個一致的界面,經過定義一個高層接口,下降訪問複雜系統的內部子系統時的複雜度,使得這一子系統更加容易使用。