策略模式的应用
策略模式可以说是项目中经常会使用到的一种比较实用的设计模式。
如果你的代码里面有这样的代码:
public void toSomething(String command){
if(command.equals("start")){
//TODO something
}else if(command.equals("stop")){
//TODO something
}else if(command.equals("increase")){
//TODO something
}
......
}
也许可以考虑一下策略模式
策略模式的实现
用组合代替继承
构造英雄抽象类
现在我们有了一个英雄基类,他拥有两个因为,飞行和释放技能。
但不是所有的英雄都能飞行,而且每个英雄的技能也都不同。
在这里大家可能会把fly和skill设计成接口。让每个英雄都自己实现,但这样的话就没办法重复利用代码了。
所以这样地方用组合更加合适。
public abstract class Hero {
protected FlyBehavior flyBehavior;
protected SkillBehavior skillBehavior;
public void fly(){
flyBehavior.fly();
}
public void skill(){
skillBehavior.skill();
}
public void purpose(){
System.out.println("Save the world");
}
}
构造具体英雄
钢铁侠:能飞,技能是武装装甲
public class IronMan extends Hero {
public IronMan(){
flyBehavior = new FlyWithWings();
skillBehavior = new Armor();
}
}
绿巨人-无敌浩克:不能飞,技能是变身
public class Hulk extends Hero{
public Hulk(){
flyBehavior = new FlyNoWay();
skillBehavior = new Transform();
}
}
描述行为
飞行的行为
public interface FlyBehavior {
void fly();
}
public class FlyNoWay implements FlyBehavior{
@Override
public void fly() {
System.out.println("I can not fly");
}
}
public class FlyWithWings implements FlyBehavior{
@Override
public void fly() {
System.out.println("I am can fly!");
}
}
释放的技能
public interface SkillBehavior {
void skill();
}
public class Armor implements SkillBehavior{
@Override
public void skill() {
System.out.println("Put on armor outerwear");
}
}
public class Transform implements SkillBehavior{
@Override
public void skill() {
System.out.println("Become stronger and bigger");
}
}
测试
public class HeroSimulator {
public static void main(String[] args) {
Hero hulk = new Hulk();
hulk.fly();
hulk.skill();
Hero ironMan = new IronMan();
ironMan.fly();
ironMan.skill();
}
}
总结
设计原则:
找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。
策略模式定义了一族算法,分别封装起来,让它们之间可以互相替换,让算法的变化独立于使用算法的客户。