外觀模式
外觀模式(Facade Pattern)隱藏系統的複雜性,並向客戶端提供了一個客戶端可以存取系統的介面。這種類型的設計模式屬於結構型模式,它向現有的系統添加一個接口,來隱藏系統的複雜性。
這種模式涉及到一個單一的類,該類提供了客戶端請求的簡化方法和對現有系統類方法的委託呼叫。
介紹
意圖:為子系統中的一組接口提供一個一致的介面,外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
主要解決:降低存取複雜系統的內部子系統時的複雜度,簡化客戶端與之的介面。
何時使用:1、客戶端不需要知道系統內部的複雜聯繫,整個系統只需提供一個"接待員"即可。 2、定義系統的入口。
如何解決:客戶端不與系統耦合,外觀類別與系統耦合。
關鍵程式碼:在客戶端和複雜系統之間再加一層,這次將呼叫順序、依賴關係等處理好。
應用實例:1、去醫院看病,可能要去掛號、門診、劃價、取藥,讓病人或病人家屬覺得很複雜,如果有提供接待人員,只讓接待人員來處理,就很方便。 2、JAVA 的三層開發模式。
優點:1、減少系統相互依賴。 2、提高靈活性。 3.提高了安全性。
缺點:不符合開閉原則,如果要改東西很麻煩,繼承重寫都不合適。
使用場景:1、為複雜的模組或子系統提供外界存取的模組。 2、子系統相對獨立。 3.預防低水準人員帶來的風險。
注意事項:在層次化結構中,可以使用外觀模式定義系統中每一層的入口。
實作
我們將建立一個 Shape 介面和實作了 Shape 介面的實體類別。下一步是定義一個外觀類別 ShapeMaker。
ShapeMaker 類別使用實體類別來代表使用者對這些類別的呼叫。 FacadePatternDemo,我們的示範類別使用 ShapeMaker 類別來顯示結果。
步驟 1
建立一個介面。
Shape.java
public interface Shape { void draw(); }
步驟 2
建立實作介面的實體類別。
Rectangle.java
public class Rectangle implements Shape { @Override public void draw() { System.out.println("Rectangle::draw()"); } }
#Square.java
public class Square implements Shape { @Override public void draw() { System.out.println("Square::draw()"); } }
Circle.java
##public class Circle implements Shape { @Override public void draw() { System.out.println("Circle::draw()"); } }
步驟3
建立一個外觀類別。
ShapeMaker.java
public class ShapeMaker { private Shape circle; private Shape rectangle; private Shape square; public ShapeMaker() { circle = new Circle(); rectangle = new Rectangle(); square = new Square(); } public void drawCircle(){ circle.draw(); } public void drawRectangle(){ rectangle.draw(); } public void drawSquare(){ square.draw(); } }
步驟 4
使用該外觀類別畫出各種類型的形狀。
FacadePatternDemo.java
public class FacadePatternDemo { public static void main(String[] args) { ShapeMaker shapeMaker = new ShapeMaker(); shapeMaker.drawCircle(); shapeMaker.drawRectangle(); shapeMaker.drawSquare(); } }
步驟 5
驗證輸出。
Circle::draw() Rectangle::draw() Square::draw()