責(zé)任鏈模式
使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接收者之間發(fā)生耦合。此模式將這些對(duì)象連成一條鏈,并沿著這條鏈傳遞請(qǐng)求,直到有一個(gè)對(duì)象處理它為止。最初的定義出現(xiàn)于《設(shè)計(jì)模式》(Addison-Wesley,1994)。
何時(shí)使用責(zé)任鏈模式
- 有多個(gè)對(duì)象可以處理請(qǐng)求,而處理程序只有在運(yùn)行時(shí)才能確定。
- 向一組對(duì)象發(fā)送請(qǐng)求,而不想顯式指定處理請(qǐng)求的特定處理程序。
在游戲中RPG使用責(zé)任鏈模式
創(chuàng)建AttackHanlder父類
class AttackHandler: NSObject {
private var nextAttackHandler: AttackHandler?
init(nextAttackHandler: AttackHandler?) {
self.nextAttackHandler = nextAttackHandler
}
func handleAttack(attack: Attack) {
nextAttackHandler?.handleAttack(attack: attack)
}
}
創(chuàng)建三個(gè)子類
class MetalArmor: AttackHandler {
override func handleAttack(attack: Attack) {
if attack.isKind(of: SwordAttack.classForCoder()) {
print("No demage from a sword attack!")
} else {
print("I don't know this attack: \(attack.classForCoder)")
super.handleAttack(attack: attack)
}
}
}
客戶端代碼
let avatar = Avatar(nextAttackHandler: nil)
let metalArmoredAvatar = MetalArmor(nextAttackHandler: avatar)
let superAvatar = CrystalShield(nextAttackHandler: metalArmoredAvatar)
let swordAttack = SwordAttack()
superAvatar.handleAttack(attack: swordAttack)
let magicFireAttack = MagicFireAttack()
superAvatar.handleAttack(attack: magicFireAttack)
let lightningAttack = LightingAttack()
superAvatar.handleAttack(attack: lightningAttack)