作者:Peng
今天我們讨論一下中介者模式(Mediator)。這次不從抽象定義開始,而是用現實世界中的一個場景來解釋它。在一個團隊裡,有産品經理,開發工程師,品質工程師。當開發完成了某些功能,将代碼送出到倉庫。相關環節人員,像品質工程師和産品經理需要被通知。
-
protocol Collogue {
-
var id: String { get }
-
func send(message: String)
-
func receive(message: String)
-
}
-
class Developer: Collogue {
-
var id: String
-
var qe: QE
-
var pm: PM
-
init(qe: QE, pm: PM) {
-
self.id = "Developer"
-
self.qe = qe
-
self.pm = pm
-
}
-
func send(message: String) {
-
qe.receive(message: message)
-
pm.receive(message: message)
-
}
-
func receive(message: String) {
-
print(message)
-
}
-
}
-
class QE: Collogue {
-
var id: String
-
var developer: Developer
-
var pm: PM
-
init(developer: Developer, pm: PM) {
-
self.id = "QE"
-
self.developer = developer
-
self.pm = pm
-
}
-
func send(message: String) {
-
developer.receive(message: message)
-
pm.receive(message: message)
-
}
-
func receive(message: String) {
-
print(message)
-
}
-
}
-
class PM: Collogue {
-
var id: String
-
var developer: Developer
-
var qe: QE
-
init(developer: Developer, qe: QE) {
-
self.id = "PM"
-
self.developer = developer
-
self.qe = qe
-
}
-
func send(message: String) {
-
developer.receive(message: message)
-
qe.receive(message: message)
-
}
-
func receive(message: String) {
-
print(message)
-
}
-
}
每個角色都需要持有另一個角色的執行個體,這種連接配接方式是高耦合的,且很不容易修改。
現在我們需要一個中介者幫助我們簡化這個系統。中介者的目的是幫助對象之間互相交流。它讓每個對象都是跟自己進行互動而不是其他對象。目前對象不需要持有别的對象,而是持有中介者。這樣将解耦系統,它的結構圖如下所示:
我們來寫一下代碼:
-
protocol Mediator {
-
func send(message: String, sender: Colleague)
-
}
-
class TeamMediator: Mediator {
-
var colleagues: [Colleague] = []
-
func register(colleague: Colleague) {
-
colleagues.append(colleague)
-
}
-
func send(message: String, sender: Colleague) {
-
for colleague in colleagues {
-
if colleague.id != sender.id {
-
colleague.receive(message: message)
-
}
-
}
-
}
-
}
通過持有中介者,那幾個角色對象變成了這樣:
-
protocol Colleague {
-
var id: String { get }
-
var mediator: Mediator { get }
-
func send(message: String)
-
func receive(message: String)
-
}
-
class Developer: Colleague {
-
var id: String
-
var mediator: Mediator
-
init(mediator: Mediator) {
-
self.id = "Developer"
-
self.mediator = mediator
-
}
-
func send(message: String) {
-
mediator.send(message: message, sender: self)
-
}
-
func receive(message: String) {
-
print("Developer received: " + message)
-
}
-
}
-
class QE: Colleague {
-
var id: String
-
var mediator: Mediator
-
init(mediator: Mediator) {
-
self.id = "QE"
-
self.mediator = mediator
-
}
-
func send(message: String) {
-
mediator.send(message: message, sender: self)
-
}
-
func receive(message: String) {
-
print("QE received: " + message)
-
}
-
}
-
class PM: Colleague {
-
var id: String
-
var mediator: Mediator
-
init(mediator: Mediator) {
-
self.id = "PM"
-
self.mediator = mediator
-
}
-
func send(message: String) {
-
mediator.send(message: message, sender: self)
-
}
-
func receive(message: String) {
-
print("PM received: " + message)
-
}
-
}
這樣一來,整個結構就變成了下面這樣:
-
//usage
-
let mediator = TeamMediator()
-
let qe = QE(mediator: mediator)
-
let developer = Developer(mediator: mediator)
-
let pm = PM(mediator: mediator)
-
mediator.register(colleague: developer)
-
mediator.register(colleague: qe)
-
mediator.register(colleague: pm)
-
mediator.send(message: "Hello world!", sender: developer)