看了网上一些java设计模式的资料,http://blog.csdn.net/lmj623565791/article/details/24116745这位大神写的挺好,根据
策略模式的实现步骤:
1. 变化的方法抽象为行为接口
2. 对每个行为接口定义一些具体的实现类
3. 定义一个对象的抽象类,在类中声明各个行为接口
4. 在抽象类中定义各个行为的set方法
5. 调用各个行为接口的方法来定义抽象类中的方法
根据大神的例子简单的写了下:
假设公司需要做一款武侠游戏,我们就是负责游戏的角色模块,需求是这样的:每个角色对应一个名字,每类角色对应一种样子,每个角色拥有一个攻击、防御的技能。
1. 按照上面总结的第一步,把方法抽象为行为接口:
package design.strategy.behavior;
public interface IAttackBehavior {
void attack();
}
package design.strategy.behavior;
public interface IDefendBehavior {
void defend();
}
2. 定义攻击和防御行为接口具体实现类
攻击行为的实现:AttackA,AttackB
package design.strategy.behaviorimp;
import design.strategy.behavior.IAttackBehavior;
public class AttackA implements IAttackBehavior {
@Override
public void attack() {
System.out.println("gun");
}
}
package design.strategy.behaviorimp;
import design.strategy.behavior.IAttackBehavior;
public class AttackB implements IAttackBehavior {
@Override
public void attack() {
System.out.println("knife");
}
}
防御行为的实现:DefendA,DefendB
package design.strategy.behaviorimp;
import design.strategy.behavior.IDefendBehavior;
public class DefendA implements IDefendBehavior {
@Override
public void defend() {
System.out.println("defend A");
}
}
package design.strategy.behaviorimp;
import design.strategy.behavior.IDefendBehavior;
public class DefendB implements IDefendBehavior {
@Override
public void defend() {
System.out.println("defend B");
}
}
3. 定义一个角色的抽象类,声明Attack和Defend行为接口,定义方法
package design.strategy;
import design.strategy.behavior.IAttackBehavior;
import design.strategy.behavior.IDefendBehavior;
public abstract class Role {
public String name; //声明名字区别角色
public IAttackBehavior attackBehavior; //声明攻击行为接口
public IDefendBehavior defendBehavior; //声明防御行为接口
//定义攻击行为的set方法
public void setAttackBehavior(IAttackBehavior attackBehavior) {
this.attackBehavior = attackBehavior;
}
//定义防御行为的set方法
public void setDefendBehavior(IDefendBehavior defendBehavior) {
this.defendBehavior = defendBehavior;
}
//通过调用Attack行为接口的attack方法来定义抽象类中的方法
public void attack() {
attackBehavior.attack();
}
//通过调用Defend行为接口的defend方法来定义抽象类中的方法
public void defend() {
defendBehavior.defend();
}
}
4. 定义一个Role类继承抽象类
package design.strategy;
public class PlayRole extends Role {
public PlayRole(String name) {
this.name = name;
}
}
5. 测试
package design.strategy;
import design.strategy.behaviorimp.AttackA;
import design.strategy.behaviorimp.DefendA;
public class Test {
public static void main(String[] args) {
Role roleA = new PlayRole("A");
roleA.setAttackBehavior(new AttackA());
roleA.setDefendBehavior(new DefendA());
System.out.println(roleA.name);
roleA.attack();
roleA.defend();
}
}
输出:
A
gun
defend A