天天看點

設計模式(四) - Facade 外觀模式(結構型)外觀模式

外觀模式

外觀模式(Facade Pattern)隐藏系統的複雜性,并向用戶端提供了一個用戶端可以通路系統的接口。這種類型的設計模式屬于結構型模式,它向現有的系統添加一個接口,來隐藏系統的複雜性。

這種模式涉及到一個單一的類,該類提供了用戶端請求的簡化方法和對現有系統類方法的委托調用。

介紹

意圖:為子系統中的一組接口提供一個一緻的界面,外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。

主要解決:降低通路複雜系統的内部子系統時的複雜度,簡化用戶端與之的接口。

何時使用: 1、用戶端不需要知道系統内部的複雜聯系,整個系統隻需提供一個"接待員"即可。 2、定義系統的入口。

如何解決:用戶端不與系統耦合,外觀類與系統耦合。

關鍵代碼:在用戶端和複雜系統之間再加一層,這一層将調用順序、依賴關系等處理好。

應用執行個體: 1、去醫院看病,可能要去挂号、門診、劃價、取藥,讓患者或患者家屬覺得很複雜,如果有提供接待人員,隻讓接待人員來處理,就很友善。 2、JAVA 的三層開發模式。

優點: 1、減少系統互相依賴。 2、提高靈活性。 3、提高了安全性。

缺點:不符合開閉原則,如果要改東西很麻煩,繼承重寫都不合适。

使用場景: 1、為複雜的子產品或子系統提供外界通路的子產品。 2、子系統相對獨立。 3、預防低水準人員帶來的風險。

注意事項:在階層化結構中,可以使用外觀模式定義系統中每一層的入口。

結構

設計模式(四) - Facade 外觀模式(結構型)外觀模式

實作

我們将建立一個 Shape 接口和實作了 Shape 接口的實體類。下一步是定義一個外觀類 ShapeMaker。

ShapeMaker 類使用實體類來代表使用者對這些類的調用。FacadePatternDemo,我們的示範類使用 ShapeMaker 類來顯示結果。

設計模式(四) - Facade 外觀模式(結構型)外觀模式

步驟 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()
           

繼續閱讀