需求 根据不同商品 执行不同计价规则即不同折扣计费
1.商品计算的功能接口
2.模板类 实现功能接口
公共计算方法
特殊计算方法
重写功能接口方法即模板方法 定义计算的规则
3.水果类商品 家电类商品为 模板类子类 重写各自特殊计算方法
结果如下
代码如下
public class TemplateMethodTest { public static void main(String[] args) { //计算水果类商品 GoodsService fruitService = new FruitService(); fruitService.calculate(10); System.out.println("======================"); //计算家电类商品 GoodsService homeAppliancesService = new HomeAppliancesService(); homeAppliancesService.calculate(12); } /*** *功能描述 商品服务接口 */ interface GoodsService { /** * 计算金额 * @param amount 购买数量 */ void calculate(int amount); } /** * 模板类 */ static abstract class AbstractGoodsService implements GoodsService { /** * 公共费用计算逻辑 * @paramt * @return 返回金额 */ private BigDecimal commonCalculate() { System.out.println("执行公共费用计算:..."); return new BigDecimal("2.00"); } /** * 特殊的计算逻辑 * @param amount 购买数量 * @return 返回金额 */ protected abstract BigDecimal specificCalculate(int amount); /** * 模板方法 定义计算流程规则 */ @Override public void calculate(int amount) { // 完成通用的逻辑 BigDecimal money = commonCalculate(); // 完成特殊的逻辑 money = money.add(specificCalculate(amount)); System.out.println("共计:"+money); // 其他操作.... } } static class FruitService extends AbstractGoodsService { //九九折扣 @Override public BigDecimal specificCalculate(int amount) { System.out.println("执行水果类商品的优惠政策"); return new BigDecimal("0.99").multiply(new BigDecimal(String.valueOf(amount))); } } static class HomeAppliancesService extends AbstractGoodsService { //八折 @Override public BigDecimal specificCalculate(int amount) { System.out.println("执行家电类商品的优惠政策"); return new BigDecimal("0.8").multiply(new BigDecimal(String.valueOf(amount))); } } }