Dota中的设计模式--状态模式

来源:互联网 发布:删除数据库null 编辑:程序博客网 时间:2024/06/05 16:16

1.背景:    

        上午开黑,狂跪了N局,最后一把,果断手影魔,一吃树4树枝出门想速出瓶子,对面lion见我补给少开始消耗,没办法猥琐补刀吧,一翻消耗后,我:半血,经济568。只差一个兵得钱了,虽然兵线不好,没办法硬着头皮 想上去补法师兵,攻击出手准备回撤,lion突然抬手插起,开始点人一下,两下,还有3分之一血,眼看要逃出攻击范围,对面2级赏金突然破隐出现,还打出残废效果,lion跟上一记普攻带走。然后……被先到六lion单杀,打野被赏金杀,下路收钱被3人开雾杀……好吧,最后2杀11死,GG。

2.分析:

        赏金的隐身的破隐伤害,加上3技能的残废效果和额外的暴击让没有多少状态的SF雪上加霜,惨死于lion刀下。

        回到设计模式,看看BH这个英雄攻击方式:

1.普通情况下,只计算攻击造成的伤害。

2.使用2技能隐身情况下,在1基础上额外加上XX点的破隐伤害。

3.在有3技能的情况下,在1基础上加上XX被的暴击伤害,并使目标进入残废状态。

        很好,很imba的一个英雄,那究竟如何实现这样的攻击方式?用简单的if判断?可以,但如果赏金又出到一把暗灭,又或者是大炮呢,我们的atteck方法又得重新修改,显然不是一个优秀设计所要求的。好好想想,根据一个行为根据不同状态出现不同的效果,这不就是状态模式吗?

一个简单的状态模式类图:

AbstractHero类:

public abstract class AbstractHero {
private String user;
private List<HeroState> states = new ArrayList<HeroState>();

public abstract void useSkill1();
public abstract void useSkill2();

public AbstractHero(String user) {
this.user = user;
}

public void addState(HeroState state){
states.add(state);
}

public void attack(AbstractHero target){
for(HeroState s : states){
s.attack(target);
}
}

public String toString() {
return user;
}

}

HeroBH类:

public class HeroBH extends AbstractHero{

public HeroBH(String user) {
super(user);
}

public void useSkill1() {
HeroState s = new BHYinshenState();
this.addState(s);
}

public void useSkill2() {
HeroState s = new AttackCanfeiState();
this.addState(s);
}
}

HeroState的两个实例:

public class AttackCanfeiState implements HeroState {
public void attack(AbstractHero target) {
System.out.println(target + "额外收到2.25倍的暴击伤害并进入残废状态");
}
}

public class BHYinshenState implements HeroState {
public void attack(AbstractHero target) {
System.out.println(target + "额外受到了XX的破隐伤害");
}
}

test类:

public class Test {
public static void main(String[] args) {
AbstractHero h = new HeroBH("htYY");
AbstractHero t = new HeroSF("2009");
System.out.println("第一次攻击:");
h.useSkill2();
h.attack(t);
System.out.println("第二次攻击:");
h.useSkill2();
h.useSkill1();
h.attack(t);
}
}

测试结果:

第一次攻击:
2009额外收到2.25倍的暴击伤害并进入残废状态
第二次攻击:
2009额外收到2.25倍的暴击伤害并进入残废状态
2009额外收到2.25倍的暴击伤害并进入残废状态
2009额外受到了XX的破隐伤害

从结果看基本实现了根据不同状态达到不同attack效果的需求了,若要扩展功能,只需加入相应的state实例,不影响hero对象。

注意:第二次攻击时残废效果出现两次,原因很简单,因为每使用一个技能便向states中添加一个状态,攻击结束没有删除,这个问题我想可能会在另一个设计模式中解决,大家也可以一起想想办法。

3.更多的例子:

XXX is on a Killing Spree!!!

XXX is Dominating!!!

XXX has a Mega-Kill!!!

XXX is Unstoppable!!!

……

XXX is Beyond Godlike!!!

大家是否为这些激动人心的声音而疯狂,但在这疯狂被后却是你不断变化的状态,对方终结你时得到的金钱树是跟状态挂钩的,具体怎么用状态模式,我就不再多说了。

4.总结:

    状态模式的本质:根据状态分离和选择行为。不同称号被击杀属于不同的行为,这些行为会根据状态的不同动态选择,状态的分离则更好的支持了程序的扩展。

    状态模式和策略模式:两个结构相同,但用处各异,策略往往是根据不同情境选择不同的实现算法,状态模式这是为了实现对象不同行为,往往会改变对象,如更加攻击力,速度,模型的施法动作等。

5.继续中……

     求大神们带小弟持续超神,谢谢!!!



原创粉丝点击