一、什么是策略模式

        它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略)。Strategy模式主要用来平滑地处理算法的切换 。


二、策略模式中的角色

    1、Strategy: 定义所有支持的算法的公共接口。

    2、ConcreteStrategy:封装了具体的算法或行为,继承于Strategy。

    3、Context:用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用。


三、策略模式类图

        八、策略模式(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定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。

        简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。