大话设计模式阅读摘要(二)-策略模式

简介

策略模式是用来封装算法,封装变化的,只在咱们在分析业务的时候出如今不一样的时间段使用不一样的业务逻辑,就能够考虑使用策略模式java

优点

  • 以相同的方式调用了全部算法,减小了各类算法类与使用算法类之间的耦合
  • 策略模式的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));
  }
}

复制代码
  • 测试结果

相关文章
相关标签/搜索