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.继续中……
求大神们带小弟持续超神,谢谢!!!