本文已参与「新人创作礼」活动,一起开启掘金创作之路
由来
当你还是一个码农的时候,每天都要编写多少行代码每次都要创建很多类的时候,每建立一次给你一点经验值,累计到十级的时候会发现我写了这很多代码为什么不能复用呢?
这时恭喜您进入转职阶段,由码农转成会放魔法的码农。。。(多么吊炸天技能)
觉醒吧!少年。
以王者荣耀为示例题材,写代码就是打游戏!
上一篇:策略模式
抽象工厂模式: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()
输出信息:
我的名字叫:爱打战的小兵 攻击了对面敌人
我的名字叫:爱打战的小兵 放出了技能
我的名字叫:爱打战的小兵 从敌人身获取了金币