责任链模式(Chain of Responsibility)

责任链模式

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容