傳回首頁
一、概述
Facade屬于結構型模式中的一種,為子系統中的一組接口提供一個一緻的界面,Facade模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
二、适用性
1. 當你要為一個複雜子系統提供一個簡單接口時。子系統往往因為不斷演化而變得越來越複雜。大多數模式使用時都會産生更多更小的類。這使得子系統更具可重用性,也更容易對子系統進行定制,但這也給那些不需要定制子系統的使用者帶來一些使用上的困難。Facade可以提供一個簡單的預設視圖,這一視圖對大多數使用者來說已經足夠,而那些需要更多的可定制性的使用者可以越過facade層。 2. 客戶程式與抽象類的實作部分之間存在着很大的依賴性。引入facade将這個子系統與客戶以及其他的子系統分離,可以提高子系統的獨立性和可移植性。 3. 當你需要建構一個層次結構的子系統時,使用facade模式定義子系統中每層的入口點。如果子系統之間是互相依賴的,你可以讓它們僅通過facade進行通訊,進而簡化了它們之間的依賴關系。
三、參與者
1.Facade:知道哪些子系統類負責處理請求。将客戶的請求代理給适當的子系統對象。 2.Subsystemclasses:實作子系統的功能。處理由Facade對象指派的任務。沒有facade的任何相關資訊;即沒有指向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