Java設計模式百例 - 門面模式

本文源碼見: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();對象

固然,這只是一種方式,並非說門面模式就要這樣作。繼承

  • 門面也能夠是單例的,由一個單一的對象負責提供服務;
  • 門面也能夠是普通的多例的,好比其要包裝的目標是多個對象,那麼每一個對象可能會須要一個門面實例,這個時候,門面一般也是起到一種隔離的做用,好比被包裝的對象有許多接口是系統內調用的,並不對其餘模塊或子系統開放,而門面對象起到了一層代理的做用。

總結

門面模式更可能是一種設計思想,而不是具體模型。目的是爲子系統中的一組接口提供一個一致的界面,經過定義一個高層接口,下降訪問複雜系統的內部子系統時的複雜度,使得這一子系統更加容易使用。

相關文章
相關標籤/搜索