《王者荣耀》中程序24种设计模式之奥义第五式·代理模式

56 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

由来

当你还是一个码农的时候,每天都要编写多少行代码每次都要创建很多类的时候,每建立一次给你一点经验值,累计到十级的时候会发现我写了这很多代码为什么不能复用呢?
这时恭喜您进入转职阶段,由码农转成会放魔法的码农。。。(多么吊炸天技能)
觉醒吧!少年。
以王者荣耀为示例题材,写代码就是打游戏!

上一篇:策略模式

抽象工厂模式:juejin.cn/post/709080…

入口

代码示例裢接:github.com/ruanch/Desi…

进入正题(我将代替小兵惩罚你

其实有没有发现,你在打游戏的时候,每次打怪升级过程,就是一种代理模式,你(伟大的召唤师)代替小兵打败对方的小兵,获取金币和经验。
来看一下在代码里如何实现。写代理模式先搞清楚三个东西,代理场景、代理人、被代理人。
那么在这个案例里,代理场景就是游戏攻击敌人,里面有攻击、放技能、获取金币。

所以抽象类应该这样写:
@objc protocol NEAttackEnemy {

    @objc optional func attack() //攻击

    @objc optional func skill() //放技能

    @objc optional func getGold() //获取金币

}

然后谁是真的去做这件事情的人是游戏,所以游戏实现这个协议

//代理去做的一个场景
class NEGame: NSObject,NEAttackEnemy {

    var xiaoBin: NEXiaoBin

    init(xiaoBin: NEXiaoBin) {

        self.xiaoBin = xiaoBin

    }

    func attack() {

        print("\(xiaoBin.name) 攻击了对面敌人")

    }

    func skill() {

        print("\(xiaoBin.name) 放出了技能")

    }

    func getGold() {

        print("\(xiaoBin.name) 从敌人身获取了金币")

    }

}

接下来,代理人(选择的英雄)需要干这些件事

//代理人:英雄 代替小兵去攻击对面敌人
class NEHeroProxy: NSObject,NEAttackEnemy {

    var game: NEGame

     init(xiaoBin: NEXiaoBin) {

            game = NEGame(xiaoBin: xiaoBin)

}

    func attack() {

        self.game .attack()

    }

    func skill() {

        self.game .skill()

    }

    func getGold() {

        self.game .getGold()

    }

}

最后被代理人的实体:
//小兵是一个被代理人,英雄代理小兵去攻击敌人

class NEXiaoBin: NSObject {

    var name: String = ""

}

客户端的调用

//被代理人
let xiaoBin: NEXiaoBin = NEXiaoBin()

xiaoBin.name = "我的名字叫:爱打战的小兵"

//代理人

let proxy: NEHeroProxy = NEHeroProxy(xiaoBin: xiaoBin)

proxy.attack()

proxy.skill()

proxy.getGold()

输出信息:

我的名字叫:爱打战的小兵 攻击了对面敌人

我的名字叫:爱打战的小兵 放出了技能

我的名字叫:爱打战的小兵 从敌人身获取了金币

总结

image.png