策略模式定义:针对对一组算法,将每一个算法封装到具有公共接口的独立类中,使得他们可以相互替换,可以在不影响到客户端情况下发生改变。策略模式是一种行为型设计模式。
模式模型:
- 抽象策略模型:定义为公共接口,声明策略;
- 具体策略:实现抽象策略模型,提供具体的策略计算逻辑;
- 环境模型(策略持有者):包含策略模型引用,策略方法的调用等,可以是独立的一个类也可以就是调用策略本身对象。
抽象策略只是作为一个公共父类,可以使用类,定义成抽象的;也可以使用接口来实现。这里用接口来做例子。
抽象策略类,只定义了一个策略方法。
public interface AbsStrategy {
void fight(); //
}
俩个具体策略类,分别是械斗策略与空手格斗策略。
//使用枪械,枪斗
public class GunAbsStrategy implements AbsStrategy {
@Override
public void fight() {
Log.d("TAG", "FIGHT WITH GUN");
}
}
//不使用武器,空手格斗
public class RiotStrategy implements AbsStrategy {
@Override
public void fight() {
Log.d("TAG", "FIGHT WITH RIOT");
}
}
环境模型,根据不同环境条件自由切换不同策略。
public class BattleGround {
private AbsStrategy strategy;
public AbsStrategy getStrategy() {
return strategy;
}
public void setStrategy(AbsStrategy strategy) {
this.strategy = strategy;
}
public void startFight() {
strategy.fight();
}
}
具体使用例子:
BattleGround battle = new BattleGround();
//空手格斗,使用格斗策略
battle.setStrategy(new RiotStrategy());
battle.startFight();
//切换枪斗策略
battle.setStrategy(new GunAbsStrategy());
battle.startFight();
策略模式的应用场景:
- 需要根据不同环境条件动态地在几种实现算法中选择一种时;
- 实现算法相互独立,并且要求隐藏具体算法的实现细节时;
优势:
- 可以避免使用多重条件语句;
- 策略类的继承或实现关系,使公共策略部分可以迁移到父类中,避免代码重复;
- 策略类可以相互替换,相互独立并且不会对调用者产生影响,灵活,安全;
劣势:
- 要理解所有策略算法的区别,以便能选择最合适策略类,增加时间开销;
- 可能会产生很多的具体策略类。
小结一下,策略模式其实应用还是很广泛的。很多的业务都会根据不一样的条件从而要去处理不同的业务。就可以把这些不同的业务当成是具体策略模型。抽象,封装策略会使得代码看起来更加的有结构,而不是清一色的if else。当然也不能滥用,要在适当的情况下使用。