简介
策略模式是用来封装算法,封装变化的,只在我们在分析业务的时候出现在不同的时间段使用不同的业务逻辑,就可以考虑使用策略模式
优势
- 以相同的方式调用了所有算法,减少了各种算法类与使用算法类之间的耦合
- 策略模式的Strategy类层次为Context定义了一系列可重用的算法或行为,有助于提取这些算法中的公共功能
- 简化单元测试
代码
- 常量类
package com.design.design.strategy;
/**
* @author zhaozha
* @date 2019/11/3 上午9:32
*/
public class Constant {
public static final int JAVA_SALARY_INCENTIVE = 10;
public static final int PHP_SALARY_INCENTIVE = 1;
}
- 对象
package com.design.design.strategy;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import java.math.BigDecimal;
/**
* @author zhaozha
* @date 2019/11/3 上午9:17
*/
@Data
@Builder
@AllArgsConstructor
@RequiredArgsConstructor
public class Salary {
private int day;
private BigDecimal datPay;
}
- 抽象父类
package com.design.design.strategy;
import java.math.BigDecimal;
/**
* @author zhaozha
* @date 2019/11/4 下午8:33
*/
public abstract class BaseSalaryCalculation {
/**
* 计算月薪
*
* @param salary 计费对象
*/
public abstract BigDecimal getSalary(Salary salary);
}
- JAVA子类
package com.design.design.strategy;
import java.math.BigDecimal;
import static com.design.design.strategy.Constant.JAVA_SALARY_INCENTIVE;
/**
* @author zhaozha
* @date 2019/11/3 上午9:14
*/
public class JavaSalaryCalculation extends BaseSalaryCalculation {
/**
* JAVA激励10天
*
* @param salary 计费对象
* @return 月薪
*/
@Override
public BigDecimal getSalary(Salary salary) {
return salary.getDatPay().multiply(new BigDecimal(salary.getDay() + JAVA_SALARY_INCENTIVE));
}
}
- PHP子类
package com.design.design.strategy;
import java.math.BigDecimal;
import static com.design.design.strategy.Constant.PHP_SALARY_INCENTIVE;
/**
* @author zhaozha
* @date 2019/11/3 上午9:15
*/
public class PHPSalaryCalculation extends BaseSalaryCalculation {
/**
* PHP激励1天
*
* @param salary 计费对象
* @return 月薪
*/
@Override
public BigDecimal getSalary(Salary salary) {
return salary.getDatPay().multiply(new BigDecimal(salary.getDay() + PHP_SALARY_INCENTIVE));
}
}
- Context类
package com.design.design.strategy;
import lombok.extern.slf4j.Slf4j;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author zhaozha
* @date 2019/11/4 下午8:33
*/
@Slf4j
public class SalaryContext {
BaseSalaryCalculation baseSalaryCalculation = null;
public SalaryContext(Class c) {
try {
baseSalaryCalculation = (BaseSalaryCalculation) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
public BigDecimal getSalary(Salary salary) {
// 抽取公共部分,如记个日志
log.info("计算时间:{}",new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
return baseSalaryCalculation.getSalary(salary);
}
}
- 测试
package com.design.design.strategy;
import lombok.extern.slf4j.Slf4j;
import java.math.BigDecimal;
/**
* @author zhaozha
* @date 2019/11/4 下午8:39
*/
@Slf4j
public class Test {
public static void main(String agrs[]) {
SalaryContext salaryContext = new SalaryContext(JavaSalaryCalculation.class);
Salary salary = Salary.builder().day(10).datPay(new BigDecimal("10")).build();
log.info("JAVA工资:{}",salaryContext.getSalary(salary));
}
}
- 测试结果
