java设计模式之策略模式

一,策略模式的好处,解耦,增加可维护性,代码复用性

二,什么时候用策略模式,当计算同一个业务,有不同的算法时候,比如年终奖金问题

三,以下是一个公司的年终奖的两种方式,

不采用策略模式:写很多if语句,如果后续有修改,要修改源码,不便于维护等

java设计模式之策略模式

采用java设计模式之策略模式

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.输出结果如下:


java设计模式之策略模式