美文网首页
责任链模式(Chain of Responsibility)

责任链模式(Chain of Responsibility)

作者: 863cda997e42 | 来源:发表于2017-09-26 09:38 被阅读18次

    责任链模式

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

    相关文章

      网友评论

          本文标题:责任链模式(Chain of Responsibility)

          本文链接:https://www.haomeiwen.com/subject/uhajextx.html