天天看點

23設計模式之外觀模式(Facade)一、概述二、适用性三、參與者四、類圖 五、代碼實作 六、測試

傳回首頁

一、概述

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

二、适用性

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

三、參與者

        1.Facade:知道哪些子系統類負責處理請求。将客戶的請求代理給适當的子系統對象。         2.Subsystemclasses:實作子系統的功能。處理由Facade對象指派的任務。沒有facade的任何相關資訊;即沒有指向facade的指針。

四、類圖 

23設計模式之外觀模式(Facade)一、概述二、适用性三、參與者四、類圖 五、代碼實作 六、測試

五、代碼實作 

1. 子系統的功能接口

a) ServiceA.swift

//
//  ServiceA.swift
//  23設計模式
//
//  Created by 陽君 on 14/12/2.
//  Copyright (c) 2014年 六月. All rights reserved.
//

import Foundation

/// 服務A接口
protocol ServiceA {
    
    func methodA()
    
}
           

b) ServiceB.swift

//
//  ServiceB.swift
//  23設計模式
//
//  Created by 陽君 on 14/12/2.
//  Copyright (c) 2014年 六月. All rights reserved.
//

import Foundation

/// 服務B接口
protocol ServiceB {
    
    func methodB()
    
}
           

2. Subsystemclasses:實作子系統的功能。處理由Facade對象指派的任務。沒有facade的任何相關資訊;即沒有指向facade的指針。

a) ServiceAImpl.swift

//
//  ServiceAImpl.swift
//  23設計模式
//
//  Created by 陽君 on 14/12/2.
//  Copyright (c) 2014年 六月. All rights reserved.
//

import Foundation

/// ServiceA的實作
class ServiceAImpl: ServiceA {
    
    func methodA() {
        print("這是服務A")
    }
    
}
           

b) ServiceBImpl.swift

//
//  ServiceBImpl.swift
//  23設計模式
//
//  Created by 陽君 on 14/12/2.
//  Copyright (c) 2014年 六月. All rights reserved.
//

import Foundation

/// ServiceB的實作
class ServiceBImpl: ServiceB {
    
    func methodB() {
        print("這是服務B")
    }
    
}
           

3. Facade:知道哪些子系統類負責處理請求。将客戶的請求代理給适當的子系統對象。

Facade.swift

//
//  Facade.swift
//  23設計模式
//
//  Created by 陽君 on 14/12/2.
//  Copyright (c) 2014年 六月. All rights reserved.
//

import Foundation

/// Facade知道哪些子系統類負責處理請求。将客戶的請求代理給适當的子系統對象。
class Facade {
    
    /// 服務A
    let sa:ServiceA = ServiceAImpl()
    /// 服務B
    let sb:ServiceB = ServiceBImpl()
    
    // MARK: 請求A
    func methodA() {
        // 協同工作
        sa.methodA()
        sb.methodB()
    }
    
    // MARK: 請求B
    func methodB() {
        sb.methodB()
    }
}
           

六、測試

1. 代碼

// 外觀模式
let facade = Facade()
facade.methodA();
print("=========")
facade.methodB();
           

2. 運作結果

這是服務A

這是服務B

=========

這是服務B

繼續閱讀