责任链模式(Chain of Responsibility)

2017-09-26  本文已影响18人  863cda997e42

责任链模式

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间发生耦合。此模式将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。最初的定义出现于《设计模式》(Addison-Wesley,1994)。

何时使用责任链模式

  1. 有多个对象可以处理请求,而处理程序只有在运行时才能确定。
  2. 向一组对象发送请求,而不想显式指定处理请求的特定处理程序。

在游戏中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)

GitHub地址

上一篇 下一篇

猜你喜欢

热点阅读