策略模式

/**
 * 策略模式:需求:景点卖票,如果是儿童免票,成人原价,学生半价,如果要实现这个效果,并且将来非常容易拓展,那么就可以使用策略模式,策略模式
 * 就是将不同的算法抽取出来,每个算法都是平行的.跟if--else if--else if一样,每个算法都是互相平行个关系,将来要新增一个算法,只要实现
 * 算法接口就行了;
 * 特点:一个算法接口和多个实现子类,一个上下文类,该类以组合的方式引入一个算法类,通过该算法类调用算法,对外统一暴露上下文类
 *
 */

//算法接口,计算门牌费用
public interface IStrategy {
    BigDecimal getTicketAmount(BigDecimal originalAmount);
}
//成人票价算法
public class AdualtStrategy implements IStrategy {
    @Override
    public BigDecimal getTicketAmount(BigDecimal originalAmount) {
        System.out.println("普通成人,原价");
        return originalAmount;
    }
}
//儿童票价计算
public class ChildrenStrategy implements IStrategy {
    @Override
    public BigDecimal getTicketAmount(BigDecimal originalAmount) {
        System.out.println("小于1.5米的儿童,免费");
        return BigDecimal.ZERO;
    }
}
//学生票价计算
public class StudentStrategy implements IStrategy {
    @Override
    public BigDecimal getTicketAmount(BigDecimal originalAmount) {
        System.out.println("学生半价");
        return originalAmount.multiply(new BigDecimal("0.5"));
    }
}
public class Test {
    public static void main(String[] args) {
        //成人买票
        IStrategy adualt = new AdualtStrategy();
        ContextStragy contextStragy = new ContextStragy();
        contextStragy.setStrategy(adualt);
        System.out.println(contextStragy.getTicketPay(new BigDecimal("300")));

        //学生买票

        StudentStrategy student = new StudentStrategy();
        contextStragy.setStrategy(student);
        System.out.println(contextStragy.getTicketPay(new BigDecimal("300")));


    }
}
//新增一种策略,不用更改之前的代码,直接创建一个策略实现子类就行了,方便拓展,例如针对老人打2折
原文地址:https://www.cnblogs.com/yangxiaohui227/p/10929873.html