定义

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

使用场景

一个系统有许多许多类,而区分它们的只是他们直接的行为。
在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。

UML

策略模式 - 图1

优点

  • 1、算法可以自由切换。
  • 2、避免使用多重条件判断。
  • 3、扩展性良好。

    缺点

  • 1、策略类会增多。

  • 2、所有策略类都需要对外暴露。

    代码示例

    Strategy.java

    1. public interface Strategy {
    2. public int doOperation(int num1, int num2);
    3. }

    OperationAdd.java

    1. public class OperationAdd implements Strategy{
    2. @Override
    3. public int doOperation(int num1, int num2) {
    4. return num1 + num2;
    5. }
    6. }

    OperationSubtract.java

    1. public class OperationSubtract implements Strategy{
    2. @Override
    3. public int doOperation(int num1, int num2) {
    4. return num1 - num2;
    5. }
    6. }

    OperationMultiply.java

    1. public class OperationMultiply implements Strategy{
    2. @Override
    3. public int doOperation(int num1, int num2) {
    4. return num1 * num2;
    5. }
    6. }

    Context.java

    1. public class Context {
    2. private Strategy strategy;
    3. public Context(Strategy strategy){
    4. this.strategy = strategy;
    5. }
    6. public int executeStrategy(int num1, int num2){
    7. return strategy.doOperation(num1, num2);
    8. }
    9. }

    Test.java

    1. public class Test {
    2. public static void main(String[] args) {
    3. Context context = new Context(new OperationAdd());
    4. System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
    5. context = new Context(new OperationSubtract());
    6. System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
    7. context = new Context(new OperationMultiply());
    8. System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
    9. }
    10. }

    输出结果

    1. 10 + 5 = 15
    2. 10 - 5 = 5
    3. 10 * 5 = 50

    框架示例

    java.util.Comparator

    比较器的实现就是采用了策略模式。