23設計模式之外觀模式(Facade)
阿新 • • 發佈:2019-02-01
1 概述
Facade屬於結構型模式中的一種,為子系統中的一組介面提供一個一致的介面,Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。
2 適用性
- 當你要為一個複雜子系統提供一個簡單介面時。子系統往往因為不斷演化而變得越來越複雜。大多數模式使用時都會產生更多更小的類。這使得子系統更具可重用性,也更容易對子系統進行定製,但這也給那些不需要定製子系統的使用者帶來一些使用上的困難。Facade可以提供一個簡單的預設檢視,這一檢視對大多數使用者來說已經足夠,而那些需要更多的可定製性的使用者可以越過facade層。
- 客戶程式與抽象類的實現部分之間存在著很大的依賴性。引入facade將這個子系統與客戶以及其他的子系統分離,可以提高子系統的獨立性和可移植性。
- 當你需要構建一個層次結構的子系統時,使用facade模式定義子系統中每層的入口點。如果子系統之間是相互依賴的,你可以讓它們僅通過facade進行通訊,從而簡化了它們之間的依賴關係。
3 參與者
- Facade:知道哪些子系統類負責處理請求。將客戶的請求代理給適當的子系統物件。
- Subsystemclasses:實現子系統的功能。處理由Facade物件指派的任務。沒有facade的任何相關資訊;即沒有指向facade的指標。
4 類圖
5 程式碼實現
import Cocoa
/// 服務A協議
private protocol ServiceProtocolA {
func methodA()
}
/// ServiceA的實現
private class ServiceA: ServiceProtocolA {
func methodA() {
print("這是服務A")
}
}
// MARK: -
/// 服務B協議
private protocol ServiceProtocolB {
func methodB()
}
/// ServiceB的實現
private class ServiceB: ServiceProtocolB {
func methodB() {
print("這是服務B")
}
}
// MARK: -
/// Facade知道哪些子系統類負責處理請求。將客戶的請求代理給適當的子系統物件。
private class Facade {
/// 服務A
let sa: ServiceProtocolA = ServiceA()
/// 服務B
let sb: ServiceProtocolB = ServiceB()
// MARK: 請求A
func methodA() {
// 協同工作
sa.methodA()
sb.methodB()
}
// MARK: 請求B
func methodB() {
sb.methodB()
}
}
測試
let facade = Facade()
facade.methodA();
facade.methodB();
其他
原始碼
文件修改記錄
時間 | 描述 |
---|---|
2015-11-27 | 博文完成 |