模板方法模式

90 阅读2分钟

「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战

什么时候使用模板方法模式

使用场景说明: 当系统中出现同一个功能多处在开发,而该功能中大部分代码是一样的,只有其中部分可能不同的时候。

模板方法模式实现步骤: 把功能定义成一个所谓的模板方法,放在抽象类中,模板方法中只定义通用且能确定的代码。 模板方法中不能决定的功能定义成抽象方法让具体子类去实现。

image.png

模板方法我们是建议使用final修饰的,这样会更专业,那么为什么呢? 答:模板方法是给子类直接使用的,不是让子类重写的,一旦子类重写了模板方法就失效了。

image.png

模板方法模式解决了什么问题? 极大的提高了代码的复用性。 模板方法已经定义了通用结构,模板不能确定的定义成抽象方法。

image.png

上代码:

public abstract class Account {
    /**
     * 模板方法,计算利息数额
     * @return    返回利息数额
     */
    public final double calculateInterest(){
        double interestRate = doCalculateInterestRate();
        String accountType = doCalculateAccountType();
        double amount = calculateAmount(accountType);
        return amount * interestRate;
    }
    /**
     * 基本方法留给子类实现
     */
    protected abstract String doCalculateAccountType();
    /**
     * 基本方法留给子类实现
     */
    protected abstract double doCalculateInterestRate();
    /**
     * 基本方法,已经实现
     */
    private double calculateAmount(String accountType){
        /**
         * 省略相关的业务逻辑
         */
        return 7243.00;
    }
}
public class MoneyMarketAccount extends Account {

    @Override
    protected String doCalculateAccountType() {
        
        return "Money Market";
    }

    @Override
    protected double doCalculateInterestRate() {
        
        return 0.045;
    }

}
public class CDAccount extends Account {

    @Override
    protected String doCalculateAccountType() {
        return "Certificate of Deposite";
    }

    @Override
    protected double doCalculateInterestRate() {
        return 0.06;
    }

}
public class Client {

    public static void main(String[] args) {
        Account account = new MoneyMarketAccount();
        System.out.println("货币市场账号的利息数额为:" + account.calculateInterest());
        account = new CDAccount();
        System.out.println("定期账号的利息数额为:" + account.calculateInterest());
    }

}

使用过Servlet的人都清楚,除了要在web.xml做相应的配置外,还需继承一个叫HttpServlet的抽象类。HttpService类提供了一个service()方法,这个方法调用七个do方法中的一个或几个,完成对客户端调用的响应。这些do方法需要由HttpServlet的具体子类提供,因此这是典型的模板方法模式。