/** * 策略模式:需求:景点卖票,如果是儿童免票,成人原价,学生半价,如果要实现这个效果,并且将来非常容易拓展,那么就可以使用策略模式,策略模式 * 就是将不同的算法抽取出来,每个算法都是平行的.跟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