类 A 中实现具体功能的方法移动到 B 中,B 为受委托对象,B 中的方法都是需要输入一个 A 的引用,从而才能让 B 替 A 做一些具体且复杂的操作。相当于 A 把复杂的操作委派给 B 来完成。
类 game
拥有一个 GameDelegation
. 接着输入 Game
实例到 Delegation
的实例,这个委派者可以做一些本来应该由 Game
的实例来完成的细节的事情。这样的模式称为委派模式。
委托模式与代理模式区别在于,代理模式更为严格,代理者和被代理者都共同遵守同一“已声明方法”的顶层协议;而委托模式则不需要。
// Delegation
protocol Delegation {
func gameDidStart(_ game: Game)
func game(_ game: Game)
func gameDidEnd(_ game: Game)
}
// Game
protocol Game {
var delegation: Delegation? { get set }
func play()
}
// Concrete Deleagtion
class SnakeTracker: Delegation {
func gameDidStart(_ game: Game) {
}
func game(_ game: Game) {
// do something
}
func gameDidEnd(_ game: Game) {
}
}
// Concrete Game
class SnakeGame: Game {
var delegation: Delegation?
init(_ delegation: Delegation) {
self.delegation = delegation
}
func play() {
delegation!.gameDidStart(self)
delegation!.game(self)
delegation!.gameDidEnd(self)
}
}
let gameTracker = SnakeTracker()
let game = SnakeGame(gameTracker)
game.play() // It's the func of the game, but the detail work is done by the delegation.
iOS 的 UIKit 中代理模式很常见,比如要使用 UITableView,那么让当前的 controller 遵守 UITableViewDatasource 协议和 UITableViewDelegate 协议,即可让当前的 controller 作为一个代理者的身份来设定对应方法的要如何执行,设定如何响应来自界面的操作等。