外觀模式(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、提高了安全性。
缺點:不符合開閉原則,如果要改東西很麻煩,繼承重寫都不合适。
注意事項:在階層化結構中,可以使用外觀模式定義系統中每一層的入口。