设计模式之模板(template)方法模式

设计模式之模板方法模式 -- 抽取通用代码逻辑到父类

场景介绍:

(1)电商系统中购物车进行结算时,会有多种优惠策略;

(2)不同的优惠策略在计算的价格的时候,有一些通用的基础逻辑;

(3)每种优惠策略还有一些是自己特殊的价格计算的逻辑。

1.不使用设计模式

package com.lucky.pattern.template;

/**
 * @author: LIJY
 * @Description: 不使用设计模式
 * @Date: 2021/10/2 20:36
 */
public class WithoutTemplateMethodPatternDemo {

    public static void main(String[] args) {
        DiscountCalculator1 calculator1 = new DiscountCalculator1();
        calculator1.calculate();
        DiscountCalculator2 calculator2 = new DiscountCalculator2();
        calculator2.calculate();
        DiscountCalculator3 calculator3 = new DiscountCalculator3();
        calculator3.calculate();
    }
    
    public static class DiscountCalculator1 {
        public void calculate() {
            System.out.println("通用的计算逻辑");
            System.out.println("优惠计算器1的特殊计算逻辑");
        }
    }

    public static class DiscountCalculator2 {
        public void calculate() {
            System.out.println("通用的计算逻辑");
            System.out.println("优惠计算器2的特殊计算逻辑");
        }
    }
    public static class DiscountCalculator3 {
        public void calculate() {
            System.out.println("通用的计算逻辑");
            System.out.println("优惠计算器3的特殊计算逻辑");
        }
    }

}

缺点和问题:

在三种优惠方式计算器中,都有一段通用的计算逻辑,是完全相同的代码,如果该部分通用的代码要修改,就涉及到多个地方的修改,一但某部分忘记修改就会出现问题,可维护性、扩展性较差。

2.使用设计模式

package com.lucky.pattern.template;

/**
 * @author: LIJY
 * @Description: 使用设计模式
 * @Date: 2021/10/2 20:45
 */
public class TemplateMethodPatternDemo {

    public static void main(String[] args) {
        DiscountCalculator calculator1 = new DiscountCalculator1();
        calculator1.calculate();

        DiscountCalculator calculator2 = new DiscountCalculator2();
        calculator2.calculate();

        DiscountCalculator calculator3 = new DiscountCalculator3();
        calculator3.calculate();
    }

    public interface DiscountCalculator {
        void calculate();
    }

    /**
     * 模板方法实现的精华所在
     */
    public static abstract class AbstractDiscountCalculator implements DiscountCalculator {
        public void calculate() {
            // 完成通用的计算逻辑
            commonCalculate();
            // 完成特殊的计算逻辑
            specificCalculate();
        }

        private void commonCalculate() {
            System.out.println("通用的计算逻辑");
        }

        protected abstract void specificCalculate();
    }

    public static class DiscountCalculator1 extends AbstractDiscountCalculator {
        @Override
        public void specificCalculate() {
            System.out.println("优惠计算器1的特殊计算逻辑");
        }
    }

    public static class DiscountCalculator2 extends AbstractDiscountCalculator {
        @Override
        public void specificCalculate() {
            System.out.println("优惠计算器2的特殊计算逻辑");
        }
    }

    public static class DiscountCalculator3 extends AbstractDiscountCalculator {
        @Override
        public void specificCalculate() {
            System.out.println("优惠计算器3的特殊计算逻辑");
        }
    }
}

你可能感兴趣的:(设计模式之模板(template)方法模式)