1.策略模式
    当一个问题需要多种处理方式且这几种处理方式都仅仅是在具体行为上有差异时,我们可以将这个差异抽象出来作为一个统一的接口。然后,使用者在运行时就可以根据实际情况选择不同的接口实现来处理这个问题,这个接口实现可以理解为策略。用不同的策略来解决同一个或同一类问题,即策略模式。
    举例说明:
    设计一个运算系统,可以采用不同策略 (加、减、乘、除) 来对两个数字进行运算。

    1. // 抽象出来的策略接口
    2. public interface Strategy {
    3. int doOperation(int a, int b);
    4. }
    5. // 策略:加
    6. public class AddStrategy implements Strategy {
    7. @Override
    8. public int doOperation(int a, int b) {
    9. return a + b;
    10. }
    11. }
    12. // 策略:减
    13. public class SubtractionStrategy implements Strategy {
    14. @Override
    15. public int doOperation(int a, int b) {
    16. return a - b;
    17. }
    18. }
    19. // 策略:乘
    20. public class MultiplyStrategy implements Strategy {
    21. @Override
    22. public int doOperation(int a, int b) {
    23. return a * b;
    24. }
    25. }
    26. // 策略:除
    27. public class DivisionStrategy implements Strategy {
    28. @Override
    29. public int doOperation(int a, int b) {
    30. return a / b;
    31. }
    32. }
    1. // 运算系统 (上下文)
    2. public class Context {
    3. private int mA;
    4. private int mB;
    5. private Strategy mStrategy;
    6. public Context(int a, int b) {
    7. mA = a;
    8. mB = b;
    9. // 默认策略为 “加运算”
    10. mStrategy = new AddStrategy();
    11. }
    12. public int execute() {
    13. return mStrategy.doOperation(mA, mB);
    14. }
    15. public void setStrategy(Strategy strategy) {
    16. mStrategy = strategy;
    17. }
    18. }

    策略模式优点:

    • 算法可以自由切换。
    • 避免使用多重条件进行判断。
    • 扩展性好。

    策略模式缺点:

    • 策略类会增多。
    • 所有策略类都需要对外暴露。

    策略模式使用场景:

    • 当同一类型的问题有多种且需要多种处理方式,且这多种处理方式仅仅是在行为上有差异时。
    • 需要安全地封装多种同一类型的操作时。
    • 出现同一抽象类有多个子类,且需要使用 if-elseswitch-case 来选择子类时。