天天看點

大話設計模式—外觀模式

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

這種模式涉及到一個單一的類,該類提供了用戶端請求的簡化方法和對現有系統類方法的委托調用。主要用于解決降低通路複雜系統的内部子系統時的複雜度,簡化用戶端與之的接口。

大話設計模式中程傑老師給出的定義是:外觀模式:為子系統中的一組接口提供一個一緻的界面,外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。

外觀模式結構圖:

大話設計模式—外觀模式

我們将建立一個 Shape 接口和實作了 Shape 接口的實體類。下一步是定義一個外觀類 ShapeFacade。ShapeFacade類使用實體類來代表使用者對這些類的調用。FacadePatternDemo,我們的示範類使用 ShapeFacade類來顯示結果。

類圖如下:

大話設計模式—外觀模式
//形狀接口
public interface Shape {
   void draw();
}
           

Shape接口實作類:

public class Rectangle implements Shape {

   @Override
   public void draw() {
      System.out.println("Rectangle::draw()");
   }
}
           
public class Square implements Shape {

   @Override
   public void draw() {
      System.out.println("Square::draw()");
   }
}
           
public class Circle implements Shape {

   @Override
   public void draw() {
      System.out.println("Circle::draw()");
   }
}
           

本執行個體的關鍵外觀類:

public class ShapeFacade {
   private Shape circle;
   private Shape rectangle;
   private Shape square;

   public ShapeFacade () {
      circle = new Circle();
      rectangle = new Rectangle();
      square = new Square();
   }

   public void drawCircle(){
      circle.draw();
   }
   public void drawRectangle(){
      rectangle.draw();
   }
   public void drawSquare(){
      square.draw();
   }
}
           
//測試方法
public class FacadePatternDemo {
   public static void main(String[] args) {
      ShapeFacade shapeFacade = new ShapeFacade ();

      shapeFacade.drawCircle();
      shapeFacade.drawRectangle();
      shapeFacade.drawSquare();     
   }
}
           

運作結果:

Circle:draw()
Rectangle:draw()
Square:draw()
           

使用場景:

1、在設計初期,應該要有意識地将不同的兩個層分離,比如經典的三層架構,就需要考慮在資料通路層和業務邏輯層、業務邏輯層和表示層的層與層之間建立外觀Facade,這樣可以為複雜的子系統提供一個簡單的接口,降低耦合性;

2、在開發階段,子系統往往因為不斷的重構演化而變得越來越複雜,大多數的模式使用時也都會産生很多很小的類,這本是好事,但也給外部調用的使用者程式帶來了使用上的困難,增加外觀Facade可以提供一個簡單的接口,減少它們之間的依賴;

3、在維護一個遺留的大系統時,可能這個系統已經非常難以維護和擴充,但因為它包含非常重要的功能,新的需求開發必須要依賴于它,此時使用外觀模式也是非常合适。我們可以為新系統開發一個外觀Facade類,來提供設計粗糙或高度複雜的遺留代碼的比較簡潔的接口,讓新系統和Faade對象互動,Facade與遺留代碼互動所有複雜的工作。

就如同下圖描繪的:

大話設計模式—外觀模式

優點:

1、減少系統互相依賴。

2、提高靈活性。

3、提高了安全性。

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

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

繼續閱讀