设计模式 策略模式 以角色游戏为背景

public class RoleC extends Role

{

public RoleC(String name)

{

this.name = name;

}

@Override

protected void display()

{

System.out.println(“样子1”);//从RoleA中拷贝

}

@Override

protected void run()

{

System.out.println(“烟雾弹”);

}

@Override

protected void attack()

{

System.out.println(“九阳神功”);

}

@Override

protected void defend()

{

System.out.println(“铁布衫”);//从B中拷贝

}

}

写完之后,你自己似乎没有当初那么自信了,你发现代码中已经存在相当多重复的代码,需要考虑重新设计架构了。于是你想,要不把每个技能都写成接口,有什么技能的角色实现什么接口,简单一想,觉得这想法高大尚啊,但是实现起来会发现,接口并不能实现代码的复用,每个实现接口的类,还是必须写自己写实现。于是,we need change ! 遵循设计的原则,找出应用中可能需要变化的部分,把它们独立出来,不要和那些不需要变化的代码混在一起。我们发现,对于每个角色的display,attack,defend,run都是有可能变化的,于是我们必须把这写独立出来。再根据另一个设计原则:针对接口(超类型)编程,而不是针对实现编程,于是我们把代码改造成这样:

package com.zhy.bean;

public interface IAttackBehavior

{

void attack();

}

package com.zhy.bean;

public interface IDefendBehavior

{

void defend();

}

package com.zhy.bean;

public interface IDisplayBehavior

{

void display();

}

package com.zhy.bean;

public class AttackJY implements IAttackBehavior

{

@Override

public void attack()

{

System.out.println(“九阳神功!”);

}

}

package com.zhy.bean;

public class DefendTBS implements IDefendBehavior

{

@Override

public void defend()

{

System.out.println(“铁布衫”);

}

}

package com.zhy.bean;

public class RunJCTQ implements IRunBehavior

{

@Override

public void run()

{

System.out.println(“金蝉脱壳”);

}

}

这时候需要对Role的代码做出改变:

package com.zhy.bean;

/**

  • 游戏的角色超类

  • @author zhy

*/

public abstract class Role

{

protected String name;

protected IDefendBehavior defendBehavior;

protected IDisplayBehavior displayBehavior;

protected IRunBehavior runBehavior;

protected IAttackBehavior attackBehavior;

public Role setDefendBehavior(IDefendBehavior defendBehavior)

{

this.defendBehavior = defendBehavior;

return this;

}

public Role setDisplayBehavior(IDisplayBehavior displayBehavior)

{

this.displayBehavior = displayBehavior;

return this;

}

public Role setRunBehavior(IRunBehavior runBehavior)

{

this.runBehavior = runBehavior;

return this;

}

public Role setAttackBehavior(IAttackBehavior attackBehavior)

{

this.attackBehavior = attackBehavior;

return this;

}

protected void display()

{

displayBehavior.display();

}

protected void run()

{

runBehavior.run();

}

protected void attack()

{

attackBehavior.attack();

}

protected void defend()

{

defendBehavior.defend();

}

}

每个角色现在只需要一个name了:

package com.zhy.bean;

public class RoleA extends Role

{

public RoleA(String name)

{

this.name = name;

}

}

现在我们需要一个金蝉脱壳,降龙十八掌!,铁布衫,样子1的角色A只需要这样:

package com.zhy.bean;

public class Test

{

public static void main(String[] args)

{

Role roleA = new RoleA(“A”);

roleA.setAttackBehavior(new AttackXL())//

.setDefendBehavior(new DefendTBS())//

.setDisplayBehavior(new DisplayA())//

.setRunBehavior(new RunJCTQ());

System.out.println(roleA.name + “:”);

roleA.run();

roleA.attack();

roleA.defend();

roleA.display();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值