责任链模式
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间发生耦合。此模式将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。最初的定义出现于《设计模式》(Addison-Wesley,1994)。
何时使用责任链模式
- 有多个对象可以处理请求,而处理程序只有在运行时才能确定。
- 向一组对象发送请求,而不想显式指定处理请求的特定处理程序。
在游戏中RPG使用责任链模式
创建AttackHanlder父类
class AttackHandler: NSObject {
private var nextAttackHandler: AttackHandler?
init(nextAttackHandler: AttackHandler?) {
self.nextAttackHandler = nextAttackHandler
}
func handleAttack(attack: Attack) {
nextAttackHandler?.handleAttack(attack: attack)
}
}
创建三个子类
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)
网友评论