模板方法模式

  • 这种模式非常常见。应用于同一类功能的不同实现中,例如计算优惠券的功能,可能针对不同的用户人群,有着不同的计算方式,但这些计算方式中,总会有一些通用的逻辑。此时我们可以将这些逻辑抽取到一个抽象的父类中,这个父类中通常会定义若干个通用方法和抽象方法(abstract关键字修饰)。
  • 抽象方法意味着一定要让这个抽象父类的子类去实现,所以我们通常将抽象方法定义成那些子类之间存在差异的功能,注意,抽象方法不能有实现。将普通方法定义为子类之间的通用功能。
  • 定义计算折扣的接口
  1. public interface DiscountCalculator {
  2. void calculate();
  3. }
  • 定义计算折扣的抽象父类
  1. public static abstract class AbstractDiscountCalculator implements DiscountCalculator {
  2. public void calculate() {
  3. // 完成通用的计算逻辑
  4. commonCalculate();
  5. // 完成特殊的计算逻辑
  6. specificCalculate();
  7. }
  8. //普通方法,用于抽取通用逻辑
  9. private void commonCalculate() {
  10. System.out.println("通用的计算逻辑,修改了一下");
  11. }
  12. //抽象方法没有实现,提示子类去实现。
  13. protected abstract void specificCalculate();
  14. }
  • 子类继承抽象父类并实现抽象方法
  1. public static class DiscountCalculator1 extends AbstractDiscountCalculator {
  2. @Override
  3. public void specificCalculate() {
  4. System.out.println("优惠计算器1的特殊计算逻辑");
  5. }
  6. }
  7. public static class DiscountCalculator2 extends AbstractDiscountCalculator {
  8. @Override
  9. public void specificCalculate() {
  10. System.out.println("优惠计算器2的特殊计算逻辑");
  11. }
  12. }
  13. public static class DiscountCalculator3 extends AbstractDiscountCalculator {
  14. @Override
  15. public void specificCalculate() {
  16. System.out.println("优惠计算器3的特殊计算逻辑");
  17. }
  18. }
  • 测试
  1. public static void main(String[] args) {
  2. DiscountCalculator calculator1 = new DiscountCalculator1();
  3. calculator1.calculate();
  4. DiscountCalculator calculator2 = new DiscountCalculator2();
  5. calculator2.calculate();
  6. DiscountCalculator calculator3 = new DiscountCalculator3();
  7. calculator3.calculate();
  8. }