• 需求:
      • 我们有多种优惠策略
      • 不同的优惠策略在计算的价格的时候,有一些通用的基础逻辑
      • 每种优惠策略还有一些是自己特殊的价格计算的逻辑
    • 这个模式一定要多用用,尤其是对于有多种不同实现的一些场景,比如说,不同的折扣类型,不同的优惠券类型,不同的商品类型,那肯定涉及到不同的处理逻辑。但是可以将他们共同的基础逻辑抽取到父类中,然后将要子类实现的逻辑留空,交给子类去实现。

    image.png

    1. package com.example.designpattern.template;
    2. public class TemplateMethodPatternDemo {
    3. public static void main(String[] args) {
    4. DiscountCalculator calculator1 = new DiscountCalculator1();
    5. calculator1.calculate();
    6. DiscountCalculator calculator2 = new DiscountCalculator2();
    7. calculator2.calculate();
    8. DiscountCalculator calculator3 = new DiscountCalculator3();
    9. calculator3.calculate();
    10. }
    11. public interface DiscountCalculator {
    12. void calculate();
    13. }
    14. /**
    15. * 模板方法实现的精华所在
    16. */
    17. public static abstract class AbstractDiscountCalculator implements DiscountCalculator {
    18. public void calculate(){
    19. // 完成通用计算逻辑
    20. commonCalculate();
    21. // 完成特殊的计算逻辑
    22. specificCalculate();
    23. }
    24. private void commonCalculate(){
    25. System.out.println("通用计算逻辑...");
    26. }
    27. protected abstract void specificCalculate();
    28. }
    29. public static class DiscountCalculator1 extends AbstractDiscountCalculator {
    30. protected void specificCalculate() {
    31. System.out.println("优惠计算器1的特殊计算逻辑");
    32. }
    33. }
    34. public static class DiscountCalculator2 extends AbstractDiscountCalculator {
    35. protected void specificCalculate() {
    36. System.out.println("优惠计算器2的特殊计算逻辑");
    37. }
    38. }
    39. public static class DiscountCalculator3 extends AbstractDiscountCalculator {
    40. protected void specificCalculate() {
    41. System.out.println("优惠计算器3的特殊计算逻辑");
    42. }
    43. }
    44. }