策略模式

策略模式

策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。现有一个开发要求:根据不同的条件来进行不同的计算选择。如:条件condition="add",则进行相加操作,condition="sub",则进行相减操作,condition="mul",则进行相乘操作如,此则可以选择使用策略模式来实现此功能。


1、策略模式结构图

image


2、伪代码实现

  • 定义一个策略接口,此接口为共同的一个操作,无论是相加还是相减还是其他,均调用的是此接口来进行处理
//接口
interface Strategy {
    int calculate(int a, int b);
}
  • 创建具体的计算实现类,必须要实现Strategy接口
/**相加的具体实现类*/
public class AddCalculate implements Strategy {
	public int calculate(int a, int b) {
	    //TODO 具体的业务代码,如参数校验
		return a + b;
	}
}
/**相减的具体实现类*/
class SubCalculate implements Strategy {
	public int calculate(int a, int b) {
	    //TODO 具体的业务代码,如参数校验
		return a - b;
	}
}
/**相乘的具体实现类*/
class MulCalculate implements Strategy {
	public int calculate(int a, int b) {
	    //TODO 具体的业务代码,如参数校验
		return a * b;
	}
}
  • 好了,现在相关的不同情况下的计算逻辑都已经实现了。我们还需要一个类来统一的进行管理,提供给调用方。
/**管理类*/
public class ManageStrategy {
   //声名最先定义的接口
   private Strategy strategy;
   //此方法由调用方根据具体的条件来传入相对应的Strategy接口实现,返回此管理对象
   ManageStrategy setStrategy(Strategy strategy) {
        this.strategy = strategy;
        return this;
   }
   //具体的实现
   int executeStrategy(int a, int b) {
        return strategy.calculate(a, b);
   }
}
  • 现在,我们看看如何使用
public class Client {
    int client(String condition, int a, int b) {
        ManageStrategy manageStrategy = new ManageStrategy();
	//根据不同的条件来获取不同的策略
	if("add".equest(condition)) {
            manageStrategy = manageStrategy.setStrategy(new AddCalculate());
	}
	if("sub".equest(condition)) {
            manageStrategy = manageStrategy.setStrategy(new SubCalculate());
        }
	if("mul".equest(condition)) {
            manageStrategy = manageStrategy.setStrategy(new MulCalculate());
        }
	return manageStrategy.executeStrategy(a, b);
    }
}
  • 上面的调用是不是还是有点复杂,下面看看如何优化管理类
/**我们可以在管理类里面统一的进行全面的管理,不管调用方需要什么,都在管理类里面进行选择*/
public class ManageStrategy {
   //我们可以声明一个Map来保存策略的实现类,key就是condition条件,value就是Strategy接口
   private static final Map<String, Strategy> map = new HashMap<>(8);
   static {
       map.put("add", new AddCalculate());
       map.put("sub", new SubCalculate());
       map.put("mul", new MulCalculate());
   }
   
   //提供给调用方进行调用的方法
   final public int executeStrategy(String condition, int a, int b) {
        Strategy strategy= map.get(condition);
        return strategy.calculate(a, b);
   }
}
  • 调用优化后的管理类,此后如果再增加其他方法比如相除的,那么在此业务代码client方法体中,我们就不用再次的改动这个代码了。我们只要增加一个Strtegy的实现类,实现相除的方法逻辑,然后再在管理类ManageStrategy中的静态方法map中增加对应的元素,就可以实现了。
public class Client {
    int client(String condition, int a, int b) {
        ManageStrategy manageStrtegy = new ManageStrategy();
        manageStrtegy.executeStrategy(condition, a, b);
    }
}
posted @ 2021-06-09 17:18  Aj小菜  阅读(107)  评论(0编辑  收藏  举报