一、什么是策略模式
它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略)。Strategy模式主要用来平滑地处理算法的切换 。
二、策略模式中的角色
1、Strategy: 定义所有支持的算法的公共接口。
2、ConcreteStrategy:封装了具体的算法或行为,继承于Strategy。
3、Context:用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用。
三、策略模式类图
四、策略模式代码
1、Strategy:
//抽象算法类
public abstract class Strategy {
//算法方法
public abstract double getCost(double money);
}
2、ConcreteStrategy:
//策略实现A,打八折
public class ConcreteStrategyA extends Strategy {
@Override
public double getCost(double money) {
return money * 0.8;
}
}
//策略实现B,满200减50
public class ConcreteStrategyB extends Strategy {
@Override
public double getCost(double money) {
return money >=200 ? money - 50 : money;
}
}
3、Context:
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public double getCost(double money){
return strategy.getCost(money);
}
}
4、客户端
public class MainClass {
public static void main(String[] args) {
double money = 200;
//实例化不同的策略,结果不同
Context context = new Context(new ConcreteStrategyA());
double costA = context.getCost(money);
System.out.println("ConcreteStrategyA 花费 : " + costA);
}
}
五、总结
策略模式是一种定义一系列算法的方法,所有这些完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。
简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。