定义
策略模式定义了算法族,将其分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
结构
在策略模式中,涉及到以下三个角色:
1、环境角色(Context):持有一个抽象策略角色(Strategy)的引用
2、抽象策略角色(Strategy):一个抽象角色,通常是由一个接口或者抽象类来实现,作用为为具体策略角色(ConcreteStrategy)提供所需的接口
3、具体策略角色(ConcreteStrategy):包装了相关的算法或行为的具体实现
典型代码
抽象策略类(Strategy):
public interface Strategy{
//策略方法
public void StrategyInterface();
}
具体策略类(ConcreteStrategy):
public class ConcreteStrategyA implements Strategy{
@Override
public void strategyInterface(){
//A算法或行为的具体实现
}
}
public class ConcreteStrategyB implements Strategy{
@Override
public void strategyInterface(){
//B算法或行为的具体实现
}
}
...
public class ConcreteStrategyZ implements Strategy{
@Override
public void strategyInterface(){
//Z算法或行为的具体实现
}
}
环境角色类(Context):
public class Context{
//持有一个具体策略类的对象,在使用时传入一个具体策略类对象并将其赋值于strategy
private Strategy strategy;
//策略方法
public void contextInterface(){
strategy.strategyInterface();
}
}
举个栗子
作为我们寝室枪神,我决定以吃鸡游戏为例0v0
绝地求生中有防弹衣这种装备,能够按照一定比例减免受到的伤害
public interface Armor{
public void damageCalculation(int damage){
}
}
然后呢,防弹衣又分为三个等级,以及坦诚相见
public class ArmorNull implements Armor{
@Override
public void damageCalculation(int damage){
return damage;
}
}
public class ArmorLevel1 implements Armor{
@Override
public void damageCalculation(int damage){
return damage * 0.7;
}
}
public class ArmorLevel2 implements Armor{
@Override
public void damageCalculation(int damage){
return damage * 0.6;
}
}
public class ArmorLevel3 implements Armor{
//有排面
@Override
public void damageCalculation(int damage){
return damage * 0.45;
}
}
这是我自己:
public class HandsomeMan{
private Armor armor = new Armor_null();
public void setArmor(Armor armor){
this.armor = armor;
}
public void calculate(int damage){
armor.damageCalculation(damage);
}
}
进入游戏
public HandsomeMan me = new HandsomeMan();
//被556打了一枪。。
damage = me.calculate(43);//43
//反手捡了件三级甲
me.setArmor(new ArmorLevel3());
damage = me.calculate(43);//43*0.45
总结
策略模式还是比较容易理解的,平常也都这么用了,看了书发现这也是设计模式。。
优点:提供了管理算法族的方法,合理使用继承避免了代码重复;避免了出现一万个if-else的情况
缺点:客户端必须知道所有的策略类以便在合适的时候选择合适的策略类;如果策略非常多的话策略类的数量也随之增加
防弹衣很重要