一,策略模式的好处,解耦,增加可维护性,代码复用性
二,什么时候用策略模式,当计算同一个业务,有不同的算法时候,比如年终奖金问题
三,以下是一个公司的年终奖的两种方式,
不采用策略模式:写很多if语句,如果后续有修改,要修改源码,不便于维护等
采用java设计模式之策略模式
1.先定义奖金计算策略接口 BonusCalculatorStrategy
public interface BonusCalculatorStrategy { boolean accept(Employee employee); int calculateBonus(Employee employee); }
2.同时定义Employee实体类
package com.demo.策略模式; public class Employee { private int seniority; private Rank rank; public Employee(){} public Employee(int seniority, Rank rank) { this.seniority = seniority; this.rank = rank; } public int getSeniority() { return seniority; } public void setSeniority(int seniority) { this.seniority = seniority; } public Rank getRank() { return rank; } public void setRank(Rank rank) { this.rank = rank; } public enum Rank{ p4,p5,p6 } }
3.在定义p4到p6等级雇员类,实现BounsCalculatorStrategy接口,p5与p6跟p4一致,就写p4
package com.demo.策略模式; public class P4BonusCalculatorStrategy implements BonusCalculatorStrategy{ @Override public boolean accept(Employee employee) { if(employee.getRank() == Employee.Rank.p4){ return true; } return false; } @Override public int calculateBonus(Employee employee) { if(employee.getSeniority() > 1){ return 2000; }else{ return 1000; } } }
4.最后写策略上下文类StrategyContext
package com.demo.策略模式; import java.util.ArrayList; import java.util.List; public class StrategyContext { private static List<BonusCalculatorStrategy> strategies = new ArrayList<>(); static{ strategies.add(new P4BonusCalculatorStrategy()); strategies.add(new P5BonusCalculatorStrategy()); strategies.add(new P6BonusCalculatorStrategy()); } public static BonusCalculatorStrategy getStratrgy(Employee employee){ for (BonusCalculatorStrategy bonusCalculatorStrategy:strategies ) { if(bonusCalculatorStrategy.accept(employee)){ return bonusCalculatorStrategy; } } return null; } }
5.写test类测试
package com.demo.策略模式; public class Test { public static void main(String[] args) { Employee employee1 = new Employee(1,Employee.Rank.p4); Employee employee2 = new Employee(2,Employee.Rank.p5); Employee employee3 = new Employee(3,Employee.Rank.p6); System.out.println(StrategyContext.getStratrgy(employee1).calculateBonus(employee1)); System.out.println(StrategyContext.getStratrgy(employee2).calculateBonus(employee2)); System.out.println(StrategyContext.getStratrgy(employee3).calculateBonus(employee3)); } }
6.输出结果如下: