策略模式:定义了算法族,分别分装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的
客户。
假设我们在此之前,不知道设计模式,我们要写一个角色打怪的游戏。首先,每个角色对应一个名字,
每类角色对应一中样子,以及一个逃跑方式和攻击、防御的技能。
如果不使用设计模式来进行设计的话,就会是这样:
package com.zhy.bean;
/**
* 游戏的角色超类
*
* @author zhy
*
*/
public abstract class Role
{
protected String name;
protected abstract void display();
protected abstract void run();
protected abstract void attack();
protected abstract void defend();
}
package com.zhy.bean;
public class RoleA extends Role
{
public RoleA(String name)
{
this.name = name;
}
@Override
protected void display()
{
System.out.println("样子1");
}
@Override
protected void run()
{
System.out.println("金蝉脱壳");
}
@Override
protected void attack()
{
System.out.println("降龙十八掌");
}
@Override
protected void defend()
{
System.out.println("铁头功");
}
}
这样子看上去是没问题,可是,如果为了游戏的可玩度,当需要新增游戏角色时,则又需要添加一样的类
,这样子就让代码显得杂糅,增加了工作量不说,重点是没有b格啊!所以,这个时候,我们就需要
采用设计模式来进行代码的重构了。
首先,定义好不同的行为:
package celuemoshi;
//攻击行为
public interface IAttackBehavior {
void attack();
}
package celuemoshi;
//防御行为
public interface IDefendBehavior {
void defend();
}
package celuemoshi;
//样子
public interface IDisplayBehavior {
void display();
}
package celuemoshi;
//逃跑行为
public interface IRunBehavior {
void run();
}
然后定义角色的超类:
package celuemoshi;
public abstract class Role {
protected String name;
protected IDefendBehavior defendBehavior;
protected IDisplayBehavior displayBehavior;
protected IRunBehavior runBehavior;
protected IAttackBehavior attackBehavior;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public IDefendBehavior getDefendBehavior() {
return defendBehavior;
}
public void setDefendBehavior(IDefendBehavior defendBehavior) {
this.defendBehavior = defendBehavior;
}
public IDisplayBehavior getDisplayBehavior() {
return displayBehavior;
}
public void setDisplayBehavior(IDisplayBehavior displayBehavior) {
this.displayBehavior = displayBehavior;
}
public IRunBehavior getRunBehavior() {
return runBehavior;
}
public void setRunBehavior(IRunBehavior runBehavior) {
this.runBehavior = runBehavior;
}
public IAttackBehavior getAttackBehavior() {
return attackBehavior;
}
public void setAttackBehavior(IAttackBehavior attackBehavior) {
this.attackBehavior = attackBehavior;
}
之后就要创建某个角色了:
package celuemoshi;
public class AttackJY implements IAttackBehavior {
@Override
public void attack() {
// TODO Auto-generated method stub
System.out.println("仙法*超大玉螺旋丸");
}
}
package celuemoshi;
public class DefendTBS implements IDefendBehavior {
@Override
public void defend() {
// TODO Auto-generated method stub
System.out.println("水遁*替身术");
}
}
package celuemoshi;
public class DisplayA implements IDisplayBehavior {
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("木叶忍者村忍者");
}
}
package celuemoshi;
public class RunJCTQ implements IRunBehavior {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("瞬间移动");
}
}
package celuemoshi;
public class RoleA extends Role{
public RoleA(String name) {
this.name = name;
}
}
最后,写一个测试类来调用它:
package celuemoshi;
public class Test {
public static void main(String[] args) {
Role roleaA = new RoleA("A");
//roleaA.setAttackBehavior(new AttackJY()).setDefendBehavior(new DefendTBS()).setRunBehavior(new RunJCTQ()).setDisplayBehavior(new DisplayA());
roleaA.setAttackBehavior(new AttackJY());
roleaA.setDefendBehavior(new DefendTBS());
roleaA.setRunBehavior(new RunJCTQ());
roleaA.setDisplayBehavior(new DisplayA());
System.out.println(roleaA.name+":");
roleaA.getRunBehavior().run();
roleaA.getAttackBehavior().attack();
roleaA.getDefendBehavior().defend();
roleaA.getDisplayBehavior().display();
}
}
最终结果为:
A:
瞬间移动
仙法*超大玉螺旋丸
水遁*替身术
木叶忍者村忍者
这样就创建好了一个角色了,如果你想再创建其他新角色的话,按照这种方式增加就ok了,这样,策略模式就算是完成了。