外觀模式
外觀模式(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()