策略模式就是定义了算法族,分别封装起来,让他们之间可以互相转换,此模式让该算法的变化,不会影响到使用算法的用户。我们可以定义一些独立的类来封装不同的算法,每一个独立的类对应着一个具体的算法实现,在这里我们就将这里每一个独立的类称之为一个策略。
Strategy : 定义所有算法的公共接口(AlgorithmInterface)。Context 使用这个接口去调用 ConcreteStrategy 定义的具体算法。
abstract class Strategy { public abstract void AlgorithmInterface(); }ConcreteStrategy : 实现 Strategy 中的算法接口(AlgorithmInterface)。
class ConcreteStrategyA extends Strategy { @Override public void AlgorithmInterface() { System.out.println("算法A"); } } class ConcreteStrategyB extends Strategy { @Override public void AlgorithmInterface() { System.out.println("算法B"); } } class ConcreteStrategyC extends Strategy { @Override public void AlgorithmInterface() { System.out.println("算法C"); } }Context : 用一个 ConcreteStrategy 来配置。维护一个对 Strategy 对象的引用。
class Context { Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public void ContextInterface() { strategy.AlgorithmInterface(); } }测试代码
public class StrategyPattern { public static void main(String[] args) { Context context1 = new Context(new ConcreteStrategyA()); context1.ContextInterface(); Context context2 = new Context(new ConcreteStrategyB()); context2.ContextInterface(); Context context3 = new Context(new ConcreteStrategyC()); context3.ContextInterface(); } }运行结果
算法A 算法B 算法C1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现
