模版方法模式(Template Method Pattern)
2020-11-20 本文已影响0人
东南枝下
模版方法模式(Template Method Pattern)
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
应用场景
- 多个子类有公共方法,逻辑基本相同,可以把重要的、复杂的、核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
两个角色
-
抽象模板(Abstract Template)角色
定义一个或多个抽象操作,以便让子类实现
/** * 抽象模板(Abstract Template)角色 * <p> * 抽象账户类 * * @author Jenson */ public abstract class AbstractAccount { private String accountNumber; public AbstractAccount() { this.accountNumber = null; } public AbstractAccount(String accountNumber) { this.accountNumber = accountNumber; } /** * 基本方法,确定账户类型,留给子类实现 * * @return 账户类型 */ protected abstract String getAccountType(); /** * 基本方法,确定利息,留给子类实现 * * @return 利息 */ protected abstract double getInterestRate(); /** * 基本方法,根据账户类型和账号确定账户金额 * * @param accountType 账户类型 * @param accountNumber 账号 * @return 账户金额 */ public double calculateAmount(String accountType, String accountNumber) { // dong something return 1234.567; } /** * 模版方法,调用基本方法,完成相关逻辑 * <p> * 计算账户利息 * * @return 账户利息 */ public double calculateInterest() { String accountType = this.getAccountType(); double interestRate = this.getInterestRate(); double amount = this.calculateAmount(accountType, this.accountNumber); return amount * interestRate; } }
-
具体模板(Concrete Template)角色
实现抽象模板中定义的一个或多个抽象方法
/** * 具体模板(Concrete Template)角色 * <p> * 活期账户 * * @author Jenson */ public class DemandAccount extends AbstractAccount { @Override protected String getAccountType() { return "活期"; } @Override protected double getInterestRate() { return 0.022D; } }
/** * 具体模板(Concrete Template)角色 * <p> * 定期账户 * * @author Jenson */ public class FixedAccount extends AbstractAccount { @Override protected String getAccountType() { return "三月定期"; } @Override protected double getInterestRate() { return 0.036D; } }
调用
/**
* 调用
*
* @author Jenson
*/
public class TemplateMethodMain {
public static void main(String[] args) {
AbstractAccount account = new DemandAccount();
System.out.println("活期利息:"+account.calculateInterest());
account = new FixedAccount();
System.out.println("定期利息:"+account.calculateInterest());
}
}