1. 程式人生 > >23設計模式之外觀模式(Facade)

23設計模式之外觀模式(Facade)

1 概述

Facade屬於結構型模式中的一種,為子系統中的一組介面提供一個一致的介面,Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。

2 適用性

  1. 當你要為一個複雜子系統提供一個簡單介面時。子系統往往因為不斷演化而變得越來越複雜。大多數模式使用時都會產生更多更小的類。這使得子系統更具可重用性,也更容易對子系統進行定製,但這也給那些不需要定製子系統的使用者帶來一些使用上的困難。Facade可以提供一個簡單的預設檢視,這一檢視對大多數使用者來說已經足夠,而那些需要更多的可定製性的使用者可以越過facade層。
  2. 客戶程式與抽象類的實現部分之間存在著很大的依賴性。引入facade將這個子系統與客戶以及其他的子系統分離,可以提高子系統的獨立性和可移植性。
  3. 當你需要構建一個層次結構的子系統時,使用facade模式定義子系統中每層的入口點。如果子系統之間是相互依賴的,你可以讓它們僅通過facade進行通訊,從而簡化了它們之間的依賴關係。

3 參與者

  1. Facade:知道哪些子系統類負責處理請求。將客戶的請求代理給適當的子系統物件。
  2. Subsystemclasses:實現子系統的功能。處理由Facade物件指派的任務。沒有facade的任何相關資訊;即沒有指向facade的指標。

4 類圖

DDl-1

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 博文完成

版權所有