概述

策略模式定义了一组行为或者算法,分别封装起来,我们创建各种行为和算法会随着策略对象的改变而选择执行不同的行为和算法

策略模式图

策略模式 - 图1

举例:计算机的加减乘除法

  1. //operation接口
  2. public interface Operation {
  3. public int operate(int numA, int numB);
  4. }
  5. //两个实现类加法和减法
  6. public class AddOperation implements Operation{
  7. @Override
  8. public int operate(int a, int b){
  9. return a + b;
  10. }
  11. }
  12. //两个实现类加法和减法
  13. public class SubOperation implements Operation{
  14. @Override
  15. public int operate(int a, int b){
  16. return a - b;
  17. }
  18. }
  19. //计算器
  20. public class Calculator{
  21. private Operataion operation;
  22. //getset方法
  23. public int doOperate(int a, int b){
  24. operation.operate(a,b);
  25. }
  26. }
  27. //使用
  28. Calculator calculator = new Calculator();
  29. calculator.setOperation(new AddOperation());
  30. int result = calculator.doOperate(1, 2);

注:如果需要增加乘除开方等方法,只需要新建相应的类即可,不需要对原有代码进行修改

优缺点

优点

遵循了开闭原则,对扩展开发,对修改关闭

缺点

策略越多,类越多,代码越多

开源应用

线程池的拒绝策略

  1. //
  2. public interface RejectedExecutionHandler {
  3. void rejectedExecution(Runnable r, ThreadPoolExecutor executor);
  4. }
  5. //实现类
  6. -- AbortPolicy:丢弃任务,并抛出异常RejectedExecutionException
  7. -- DiscardPolicy:丢弃任务,但不抛出异常
  8. -- DiscardOldestPolicy:丢弃队列中最前面的任务,
  9. -- CallerRunsPolicy:由调用线程处理该任务
  10. -- RejectHandler:自定义实现

项目中实际应用

  1. /**
  2. * 对账项目 -- 文件解析
  3. * 工行txt文件
  4. * 招行csv文件
  5. * 农行excel文件
  6. */
  7. public interface Parser{
  8. public Line parse()
  9. }
  10. //工行解析器
  11. public class GHParser{
  12. }
  13. //农行解析器
  14. public class NHParser{
  15. }
  16. //招行解析器
  17. public class ZHParser{
  18. }
  19. public class ParserFlow{
  20. Parser parser = new GHParser();
  21. parser.parse();
  22. }