彻底了解JAVA-策略模式(皇室战争是怎样炼成的)

本文通过皇室战争游戏的角色设计,讲解了如何使用JAVA的策略模式来处理角色的不同攻击行为。通过将行为抽象为接口,避免了继承带来的耦合问题,实现了角色行为的动态组合和复用,提高了代码的灵活性。
摘要由CSDN通过智能技术生成


                小新大学毕业后进入一家游戏公司,最近公司准备研发一款叫皇室战争的卡牌对战游戏。玩家可以通过在战场上放置骷髅兵,王子,巨人,骑士,气球兵等各种各样的角色。这些角色相互拼杀最终摧毁敌方的国王塔赢得胜利。小新被分在了人物模型设计组跟着一位叫吉勇的资深程序员共同参与这项工作。小新从小就很喜欢玩游戏,拿到了任务后,非常积极,刷刷刷的就在黑板上画出了类图准备和他的师傅吉勇讨论。

吉勇老师请看图:所有的人物拥有不同的外表 (display)和攻击能力(attack)。角色的外表都各不相同,那么display()在Character中是一个抽象方法。Character的子类实现他们各自的display方法让不同的角色拥有不同的外表。而对于attack方法我们在Character中做一个默认实现。这样所有的角色就都能拥有攻击的能力。如果攻击的方式不同,那么我们只需要在子类中重写(Override)attack方法就好。

                吉勇老师:看起来很有道理的样子,其实并不是这样。年轻人积极是好事,但是设计不能太过急躁,得反复斟酌。每一个角色都拥有攻击的能力这并不是一个好的设计。如果我们加入天使(Angel)这样的辅助类角色,她只能给友军回复生命,并不能攻击别人,你的设计就不灵了,一款好的游戏怎么能没有奶妈?

                小新:看来是个问题,那我换一种方式。把攻击的能力定义为一个接口,如果想拥有攻击能力的只需要实现Attackable(攻击)接口。至于治疗也是一样,谁想拥有治疗技能,那么只需要实现Cureable(治疗)接口。

               

                吉勇老师:恩,这是一个更加没有道理的设计。这让我们补了一个坑,但同时又挖了另外一个坑。接口的确让攻击和治疗以技能的形式呈现。但是人物的技能是通过实现接口的方式获得的。这样耦合度很高。你想想这样的情况,有些角色攻击方式是一样的,比如野蛮人(Barbarians)和骷髅兵(Skeletons)他们都用宝剑攻击敌人。按照你的设计野蛮人和骷髅兵需要各自实现一次Attackable接口,然后我们把用宝剑攻击的代码重复写两次。这样的设计导致野蛮人和骷髅兵用同样的方式攻击敌人但是代码却不能得到复用。我们重复的代码就会变得非常多。我们要设计一套代码,我传什么样的参数给他,他就用什么方式攻击或者辅助。今天野蛮人用剑,我一秒钟就让他改用长枪。这样的设计才能应对更多的变化。

                小新:老师,我该如何去设计呢?

                吉勇老师:首先,我给你第一点建议“找出应用中可能需要变化的地方,把他分离出来。不要和那些不变化的代码混在一起”。把那些会变化的部分封装起来,让其他部分不受影响。这样系统会更有弹性。

                小新:分离“变化”与“不变”。野蛮人用剑,骷髅兵用剑,王子用长枪,天使不能攻击只能恢复友军生命。他们在战场上的行为是变化的。但是不变的是他们都会有行为。那么我需要把这些角色的行为抽象到一个行为接口(behavior)中去。用剑&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值