外觀模式
外觀模式(Facade Pattern)隱藏系統的復雜性,并向客戶端提供了一個客戶端可以訪問系統的接口。這種類型的設計模式屬于結構型模式,它向現有的系統添加一個接口,來隱藏系統的復雜性。
這種模式涉及到一個單一的類,該類提供了客戶端請求的簡化方法和對現有系統類方法的委托調用。
為一個復雜的子系統提供一個一致的高層接口。這樣,客戶端代碼就可以通過這個簡化的接口與子系統交互,而不需要了解子系統內部的復雜性。
- 降低客戶端與復雜子系統之間的耦合度。
- 簡化客戶端對復雜系統的操作,隱藏內部實現細節。
- 當客戶端不需要了解系統內部的復雜邏輯和組件交互時。
- 當需要為整個系統定義一個清晰的入口點時。
- 創建外觀類:定義一個類(外觀),作為客戶端與子系統之間的中介。
- 封裝子系統操作:外觀類將復雜的子系統操作封裝成簡單的方法。
- Facade類:提供高層接口,簡化客戶端與子系統的交互。
- 子系統類:實現具體的業務邏輯,被Facade類調用。
- 醫院接待:醫院的接待人員簡化了掛號、門診、劃價、取藥等復雜流程。
- Java三層架構:通過外觀模式,可以簡化對表示層、業務邏輯層和數據訪問層的訪問。
- 減少依賴:客戶端與子系統之間的依賴減少。
- 提高靈活性:子系統的內部變化不會影響客戶端。
- 增強安全性:隱藏了子系統的內部實現,只暴露必要的操作。
- 違反開閉原則:對子系統的修改可能需要對外觀類進行相應的修改。
- 在需要簡化復雜系統訪問時使用外觀模式。
- 確保外觀類提供的方法足夠簡單,以便于客戶端使用。
- 外觀模式適用于層次化結構,可以為每一層提供一個清晰的入口。
- 避免過度使用外觀模式,以免隱藏過多的細節,導致維護困難。
外觀模式涉及以下核心角色:
- 外觀(Facade):
- 提供一個簡化的接口,封裝了系統的復雜性。外觀模式的客戶端通過與外觀對象交互,而無需直接與系統的各個組件打交道。
- 子系統(Subsystem):
- 由多個相互關聯的類組成,負責系統的具體功能。外觀對象通過調用這些子系統來完成客戶端的請求。
- 客戶端(Client):
- 使用外觀對象來與系統交互,而不需要了解系統內部的具體實現。
https://huoyundi.com/
我們將創建一個 Shape 接口和實現了 Shape 接口的實體類。下一步是定義一個外觀類 ShapeMaker。
ShapeMaker 類使用實體類來代表用戶對這些類的調用。FacadePatternDemo 類使用 ShapeMaker 類來顯示結步驟 1
創建一個接口。
public interface Shape {
void draw();
}
創建實現接口的實體類。
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 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();
}
}
使用該外觀類畫出各種類型的形狀。
public class FacadePatternDemo {
public static void main(String[] args) {
ShapeMaker shapeMaker = new ShapeMaker();
shapeMaker.drawCircle();
shapeMaker.drawRectangle();
shapeMaker.drawSquare();
}
}
執行程序,輸出結果:https://huoyundi.com/
Circle::draw() Rectangle::draw() Square::draw()

浙公網安備 33010602011771號