模板方法模式
- 这种模式非常常见。应用于同一类功能的不同实现中,例如计算优惠券的功能,可能针对不同的用户人群,有着不同的计算方式,但这些计算方式中,总会有一些通用的逻辑。此时我们可以将这些逻辑抽取到一个抽象的父类中,这个父类中通常会定义若干个通用方法和抽象方法(
abstract关键字修饰)。 - 抽象方法意味着一定要让这个抽象父类的子类去实现,所以我们通常将抽象方法定义成那些子类之间存在差异的功能,注意,抽象方法不能有实现。将普通方法定义为子类之间的通用功能。
- 定义计算折扣的接口
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的特殊计算逻辑"); } }
public static void main(String[] args) { DiscountCalculator calculator1 = new DiscountCalculator1(); calculator1.calculate(); DiscountCalculator calculator2 = new DiscountCalculator2(); calculator2.calculate(); DiscountCalculator calculator3 = new DiscountCalculator3(); calculator3.calculate(); }