该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理
假如有一种简单的计算器,它仅支持加法和减法运算,而且只能有两个操作数;这种情况下,无论加法还是减法,他都是一种计算方式,在进行计算的时候,我们完全可以直接传入两个操作数和一种计算方式来让计算器自己根据计算方式采取对应的计算算法进行下一步计算
Calculator
- package com.designer.strategy.Context;
-
- import com.designer.strategy.Strategy.Calculation;
-
- /**
- * Context(环境类):环境角色
- * 计算器
- */
- public class Calculator {
-
- private Calculation calculation;
-
- public void setCalculation(Calculation calculation) {
- this.calculation = calculation;
- }
-
- public Integer exec(Integer operateNum1, Integer operateNum2){
- return this.calculation.calculate(operateNum1, operateNum2);
- }
- }
Calculation
- package com.designer.strategy.Strategy;
-
- /**
- * Strategy(抽象策略类)
- * 计算器中的某种计算操作
- */
- public interface Calculation {
-
- public abstract Integer calculate(Integer operateNum1, Integer operateNum2);
- }
AddCalculation
- package com.designer.strategy.ConcreteStrategy;
-
- import com.designer.strategy.Strategy.Calculation;
-
- /**
- * ConcreteStrategy(具体策略类)
- * 计算器中的加法
- */
- public class AddCalculation implements Calculation {
-
- @Override
- public Integer calculate(Integer operateNum1, Integer operateNum2) {
- return operateNum1 + operateNum2;
- }
- }
SubCalculation
- package com.designer.strategy.ConcreteStrategy;
-
- import com.designer.strategy.Strategy.Calculation;
-
- /**
- * ConcreteStrategy(具体策略类)
- * 计算器中的减法
- */
- public class SubCalculation implements Calculation {
-
- @Override
- public Integer calculate(Integer operateNum1, Integer operateNum2) {
- return operateNum1 - operateNum2;
- }
- }
Test
- package com.designer.strategy;
-
- import com.designer.strategy.ConcreteStrategy.SubCalculation;
- import com.designer.strategy.Context.Calculator;
- import com.designer.strategy.Strategy.Calculation;
-
- public class Test {
-
- public static void main(String[] args) {
-
- // 定义一个计算器
- Calculator calculator = new Calculator();
- // 定义一种算法
- Calculation sub = new SubCalculation();
- // 利用上下文环境为计算机设置算法
- calculator.setCalculation(sub);
- // 计算 100 - 21
- Integer value = calculator.exec(100, 21);
- System.out.println(value);
- }
- }