👉 這是一個或許對你有用的社群
《專案實戰(影片)》:從書中學,往事上“練” 《網際網路高頻面試題》:面朝簡歷學習,春暖花開 《架構 x 系統設計》:摧枯拉朽,掌控面試高頻場景題 《精進 Java 學習指南》:系統學習,網際網路主流技術棧 《必讀 Java 原始碼專欄》:知其然,知其所以然

👉這是一個或許對你有用的開源專案國產 Star 破 10w+ 的開源專案,前端包括管理後臺 + 微信小程式,後端支援單體和微服務架構。功能涵蓋 RBAC 許可權、SaaS 多租戶、資料許可權、商城、支付、工作流、大屏報表、微信公眾號、ERP、CRM、AI 大模型等等功能:
Boot 多模組架構:https://gitee.com/zhijiantianya/ruoyi-vue-pro Cloud 微服務架構:https://gitee.com/zhijiantianya/yudao-cloud 影片教程:https://doc.iocoder.cn 【國內首批】支援 JDK 17/21 + SpringBoot 3.3、JDK 8/11 + Spring Boot 2.7 雙版本
概述
Facade Pattern
)是一種常見的結構型設計模式,它的主要目的是簡化複雜系統的使用。可以把它想象成一個“控制面板”或者“遙控器”,透過這個控制面板,使用者可以輕鬆操作一個複雜的系統,而不需要關心繫統內部是如何運作的。-
複雜系統: 電視內部的各種硬體(顯示屏、網路模組、聲音系統、處理器等)和軟體(作業系統、應用程式等)。 -
外觀模式: 遙控器,它將所有複雜的操作集中在幾個按鈕上,使用者只需要按下遙控器上的某個按鈕(比如“開機”或“返回主螢幕”),就能觸發一系列複雜的操作,而不需要了解電視內部的具體工作原理。
基於 Spring Boot + MyBatis Plus + Vue & Element 實現的後臺管理系統 + 使用者小程式,支援 RBAC 動態許可權、多租戶、資料許可權、工作流、三方登入、支付、簡訊、商城等功能
專案地址:https://github.com/YunaiV/ruoyi-vue-pro 影片教程:https://doc.iocoder.cn/video/
在程式設計中,外觀模式是如何工作的?
-
簡化介面: 將複雜的系統封裝起來,提供一個簡單易懂的介面,減少了呼叫者的複雜度。 -
降低耦合度: 外部系統不需要直接依賴複雜的子系統,只需要依賴外觀類,減少了系統間的依賴。 -
提高可維護性: 如果系統的內部實現發生變化,外觀類的介面不變,呼叫者不需要修改任何程式碼。 -
方便擴充套件: 新的子系統可以輕鬆整合,只需要修改外觀類,不影響其他部分。
基於 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的後臺管理系統 + 使用者小程式,支援 RBAC 動態許可權、多租戶、資料許可權、工作流、三方登入、支付、簡訊、商城等功能
專案地址:https://github.com/YunaiV/yudao-cloud 影片教程:https://doc.iocoder.cn/video/
外觀設計模式 UML 類圖

operation()
),將複雜的操作委託給不同的子系統。客戶端透過呼叫外觀類的方法來簡化與多個子系統的互動。method1()
、method2()
、method3()
),但是客戶端不直接呼叫它們,而是透過外觀類來與之互動。外觀類和子系統的關係
subsystem1
, subsystem2
, subsystem3
)的方式持有多個子系統的例項。operation()
)在內部呼叫不同子系統的方法,客戶端只需要呼叫外觀類提供的簡單介面,而不需要直接與多個子系統互動。優點
-
簡化介面: 客戶端透過外觀類,避免了直接與多個複雜的子系統打交道。 -
降低耦合度: 客戶端與多個子系統之間的耦合減少,客戶端只與外觀類互動,而不需要關心子系統的具體實現。 -
增強可維護性: 如果子系統的實現發生了變化,客戶端無需改動,只需要修改外觀類的實現即可。
案例
-
航班查詢: 根據使用者輸入的起點、終點和日期查詢可用航班。 -
酒店預定: 查詢目標地點的酒店併為使用者提供預定選項。 -
旅遊套餐推薦: 根據使用者偏好推薦相關旅遊套餐。 -
支付介面對接: 與第三方支付介面對接完成支付。
外觀模式在複雜業務中的應用
Facade Pattern
) 是一種結構型設計模式,它提供了一個統一的介面,來訪問子系統中的一組介面。外觀模式透過為複雜子系統提供一個簡單的介面,隱藏了系統的複雜性,使得外部呼叫者只需要關注簡潔明瞭的介面,而不必關心其內部複雜的實現細節。簡言之,外觀模式就是在複雜的業務子系統上加一個“控制面板”(外觀類),透過簡單的按鈕(外觀類的方法)控制複雜的“機器”運轉。實戰運用
1. 專案搭建與基礎配置
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-web
</artifactId>
</dependency>
<!-- Spring Boot Starter Data JPA -->
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-data-jpa
</artifactId>
</dependency>
<!-- H2 Database (for simplicity) -->
<dependency>
<groupId>
com.h2database
</groupId>
<artifactId>
h2
</artifactId>
<scope>
runtime
</scope>
</dependency>
</dependencies>
@Entity
publicclassFlight
{
@Id
private
Long id;
private
String flightNumber;
private
String departure;
private
String arrival;
// Getters and Setters
}
@Repository
publicinterfaceFlightRepositoryextendsJpaRepository<Flight, Long>
{
}
2. 構建子系統元件
-
航班服務
@Service
publicclassFlightService
{
public List<Flight> findAvailableFlights(String departure, String arrival, LocalDate date)
{
// 實際查詢資料庫或呼叫外部航班API,此處簡化邏輯
System.out.println(
"查詢航班:"
+ departure +
" 到 "
+ arrival +
",日期:"
+ date);
return
List.of(
new
Flight(
1L
,
"AA123"
, departure, arrival));
}
}
-
酒店服務
@Service
publicclassHotelService
{
public List<Hotel> findAvailableHotels(String location, LocalDate checkInDate, LocalDate checkOutDate)
{
// 查詢酒店資訊
System.out.println(
"查詢酒店:"
+ location +
",入住:"
+ checkInDate +
",退房:"
+ checkOutDate);
return
List.of(
new
Hotel(
1L
,
"Hotel California"
, location));
}
}
-
旅遊套餐服務
@Service
publicclassPackageService
{
public List<TourPackage> recommendPackages(String destination)
{
// 推薦套餐
System.out.println(
"推薦旅遊套餐:"
+ destination);
return
List.of(
new
TourPackage(
1L
,
"Paris Special"
, destination));
}
}
3. 建立外觀類
BookingFacade
類,將多個子系統的功能集中封裝在一個外觀類中:@Service
publicclassBookingFacade
{
privatefinal
FlightService flightService;
privatefinal
HotelService hotelService;
privatefinal
PackageService packageService;
publicBookingFacade(FlightService flightService, HotelService hotelService, PackageService packageService)
{
this
.flightService = flightService;
this
.hotelService = hotelService;
this
.packageService = packageService;
}
publicbooleanbookTravel
(String departure, String arrival, LocalDate flightDate,
String hotelLocation, LocalDate checkIn, LocalDate checkOut,
String destination)
{
// 查詢航班
List<Flight> flights = flightService.findAvailableFlights(departure, arrival, flightDate);
if
(flights.isEmpty()) {
returnfalse
;
}
// 查詢酒店
List<Hotel> hotels = hotelService.findAvailableHotels(hotelLocation, checkIn, checkOut);
if
(hotels.isEmpty()) {
returnfalse
;
}
// 推薦旅遊套餐
List<TourPackage> packages = packageService.recommendPackages(destination);
if
(packages.isEmpty()) {
returnfalse
;
}
returntrue
;
}
}
4. 在 Controller 中使用外觀類
BookingFacade
來簡化業務邏輯的呼叫:@RestController
@RequestMapping
(
"/bookings"
)
publicclassBookingController
{
privatefinal
BookingFacade bookingFacade;
publicBookingController(BookingFacade bookingFacade)
{
this
.bookingFacade = bookingFacade;
}
@PostMapping
public ResponseEntity<String> bookTravel(@RequestBody TravelRequest travelRequest)
{
boolean
success = bookingFacade.bookTravel(travelRequest.getDeparture(),
travelRequest.getArrival(),
travelRequest.getFlightDate(),
travelRequest.getHotelLocation(),
travelRequest.getCheckIn(),
travelRequest.getCheckOut(),
travelRequest.getDestination());
if
(success) {
return
ResponseEntity.ok(
"旅遊預定成功"
);
}
return
ResponseEntity.badRequest().body(
"旅遊預定失敗"
);
}
}
BookingController
只需要關注如何處理使用者請求,而具體的業務邏輯(如航班查詢、酒店預定、套餐推薦)都已經被封裝在 BookingFacade
類中。無論如何修改或擴充套件預定業務,我們只需要在外觀類中進行修改,其他地方的程式碼不需要做任何變動。小結
-
降低程式碼耦合度: 將複雜的子系統封裝起來,暴露簡單的介面,降低了不同模組之間的依賴關係。 -
提升程式碼可維護性: 對於新增需求或業務變更,我們只需要在外觀類中進行修改,而不用在多個地方重複修改。 -
增強開發效率: 業務邏輯的模組化和統一化,使得開發人員能更加專注於業務實現,而不是處理複雜的互動關係。





