Swift World:设计模式-中介者

今天我们将讨论中介者模式。 让我们从现实世界中的场景开始,而不是解释抽象定义。 在团队中,有PM,开发人员和QE。 当开发人员完成对新功能的编码后,这些代码将提交给存储库。 其他股东(如量化宽松和PM)需要通知。

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) 

另一个例子是流行的通知中心(又名NSNotificationCenter)。 您可以在Internet上找到许多相关代码。