设计模式-模板方法模式使用

需求 根据不同商品 执行不同计价规则即不同折扣计费

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)));
        }
    }
}

 

posted @ 2021-06-15 09:34  wf.zhang  阅读(48)  评论(0编辑  收藏  举报