✅什么是模板方法模式,有哪些应用?

典型回答

模板方法模式是一种行为设计模式,他的主要作用就是复用代码。在很多时候,我们的代码中可能会有一些公共的部分并且还有一些定制的部分,那么公共这部分就可以定义在一个父类中,然后将定制的部分实现在子类中。这样子类可以根据需要扩展或重写父类的方法,而不需要改变算法的结构。

我们通常会把模板方法模式和策略模式一起使用,因为当我们使用策略模式的时候,会把具体的策略实现在策略服务里面,但是还剩下一些通用的逻辑,就可以通过模板方法模式进行复用。

✅你在工作中是如何使用设计模式的?

扩展知识

示例

我们拿一个常见的优惠券作为示例,假设我们需要定义一个优惠券的申请服务。

abstract class Coupon {
    // 模板方法,定义优惠券的应用流程
    public final void applyCoupon() {
        if (isCouponValid()) {
            if (isEligibleForDiscount()) {
                applyDiscount();
            }
            displayConfirmation();
        } else {
            displayInvalidCouponMessage();
        }
    }

    // 具体方法,用于判断优惠券是否有效
    protected boolean isCouponValid() {
        // 具体的判断逻辑,子类可以重写该方法来实现特定的有效性判断
        return true;
    }

    // 具体方法,用于判断用户是否符合优惠券的折扣条件
    protected boolean isEligibleForDiscount() {
        // 具体的判断逻辑,子类可以重写该方法来实现特定的条件判断
        return true;
    }

    // 抽象方法,由子类实现具体的优惠券折扣逻辑
    protected abstract void applyDiscount();

    // 抽象方法,由子类实现具体的优惠券确认展示逻辑
    protected abstract void displayConfirmation();

    // 具体方法,用于展示无效优惠券的信息
    protected void displayInvalidCouponMessage() {
        System.out.println("无效优惠券!");
    }
}

以上是一个抽象类,这个类中有一个具体的方法applyCoupon,其中定义了一个优惠券申请的具体实现,并且编排了多个其他的方法。

这就是一个典型的模板方法。我们可以基于这个抽象类来定义具体的实现:

class PercentageCoupon extends Coupon {
    @Override
    protected void applyDiscount() {
        // 具体的百分比折扣逻辑
        System.out.println("应用百分比折扣优惠!");
    }

    @Override
    protected void displayConfirmation() {
        // 具体的百分比优惠券确认展示逻辑
        System.out.println("百分比折扣优惠确认!");
    }
}


class FixedAmountCoupon extends Coupon {
    @Override
    protected void applyDiscount() {
        // 具体的固定金额折扣逻辑
        System.out.println("应用固定金额优惠!");
    }

    @Override
    protected void displayConfirmation() {
        // 具体的固定金额优惠券确认展示逻辑
        System.out.println("固定金额优惠确认!");
    }
}

以上,就是两个具体的实现,分别继承Coupon抽象类,并且实现其中的部分方法就行了。

这样我们在实际使用时,就可以直接用FixedAmountCoupon和PercentageCoupon类,并且直接调用他的applyCoupon方法就行了。如:

public class Main {
    public static void main(String[] args) {
        Coupon percentageCoupon = new PercentageCoupon();
        percentageCoupon.applyCoupon();

        System.out.println("----------------");

        Coupon fixedAmountCoupon = new FixedAmountCoupon();
        fixedAmountCoupon.applyCoupon();
    }
}

原文: https://www.yuque.com/hollis666/xkm7k3/xrldzr6lf0mey3aw