返回

复杂策略 轻松上手--聊聊策略模式

后端

策略模式到底是什么?

策略模式是一种设计模式,它定义了一系列算法,并将这些算法封装在独立的类中。策略模式允许我们选择一个算法,并在运行时使用它。这使得策略模式非常适合于需要动态改变算法的情况,可以很容易地添加或修改算法,而无需改变客户端代码。

策略模式有哪些优点?

策略模式具有以下优点:

  • 解耦:策略模式将算法与客户端代码解耦,使得算法可以独立于客户端代码进行修改和扩展。
  • 重用:策略模式可以将算法重用在不同的客户端代码中。
  • 灵活:策略模式可以很容易地添加或修改算法,而无需改变客户端代码。
  • 可扩展:策略模式可以很容易地扩展,以支持新的算法。

策略模式有哪些缺点?

策略模式也存在以下缺点:

  • 增加类的数量:策略模式需要为每种算法创建一个类,这可能会增加类的数量。
  • 性能开销:策略模式在每次调用算法时都需要进行一次方法调用,这可能会带来一定的性能开销。

策略模式的应用场景

策略模式可以应用于以下场景:

  • 需要动态改变算法的情况。
  • 需要将算法重用在不同的客户端代码中。
  • 需要很容易地添加或修改算法的情况。
  • 需要很容易地扩展,以支持新的算法的情况。

策略模式的示例

下面是一个策略模式的示例:

interface Strategy {
    int doOperation(int num1, int num2);
}

class OperationAdd implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 + num2;
    }
}

class OperationSubtract implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 - num2;
    }
}

class OperationMultiply implements Strategy {
    @Override
    public int doOperation(int num1, int num2) {
        return num1 * num2;
    }
}

class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public int executeStrategy(int num1, int num2) {
        return strategy.doOperation(num1, num2);
    }
}

public class Main {
    public static void main(String[] args) {
        Context context = new Context(new OperationAdd());
        System.out.println("10 + 5 = " + context.executeStrategy(10, 5));

        context = new Context(new OperationSubtract());
        System.out.println("10 - 5 = " + context.executeStrategy(10, 5));

        context = new Context(new OperationMultiply());
        System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
    }
}

在这个示例中,Strategy接口定义了一个doOperation()方法,它接收两个参数并返回一个结果。OperationAddOperationSubtractOperationMultiply类实现了Strategy接口,并提供了不同的算法来计算两个数字的和、差和积。Context类持有Strategy接口的引用,并使用它来执行算法。

结论

策略模式是一种非常有用的设计模式,它可以帮助我们解耦算法与客户端代码,并使算法更易于修改和扩展。策略模式可以应用于各种场景,例如需要动态改变算法的情况、需要将算法重用在不同的客户端代码中、需要很容易地添加或修改算法的情况、需要很容易地扩展,以支持新的算法的情况等。