模板方法模式(Template Method)
2015-08-26 17:11 你吃不吃麦芽糖 阅读(361) 评论(0) 收藏 举报模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造子的行为实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法。
下面考虑一个计算存款利息的例子。假设系统需要支持两种存款账号,即货币市场(Money Market)账号和定期存款(CD或Certificate of Deposite)账号。这两种账号的存款利息是不同的,因此,在计算一个存户的存款利息额时,必须区分两种不同的账号类型。
这个系统的总行为是计算出利息,这也就决定了作为一个模板方法模式的顶级逻辑应当是利息计算。由于利息计算涉及到两个步骤:一是确定账户的类型,二是确定利息的百分比,因此系统需要两个基本方法:一个基本方法给出账号种类,另一个基本方法给出利息百分比。这两个基本方法构成具体逻辑,因为账号的类型不同,所以具体逻辑会有所不同。
public abstract class Account
{
protected String accountNumber;
public Account()
{
accountNumber=null;
}
public Account(String accountNumber)
{
this.accountNumber=accountNumber;
}
/*
* 模板方法,计算利息数额
* */
public final double calculateInterest()
{
double interestRate=doCalculateInterestRate();
String accountType=doCalculateAccountType();
double amount=calculateAmount(accountType,accountNumber);
return amount*interestRate;
}
/*
* 基本方法留给子类实现
* **/
protected abstract String doCalculateAccountType();
protected abstract double doCalculateInterestRate();
public final double calculateAmount(String accountType,String accountNumber)
{
return 7243.00D;
}
}
public class CDAccount extends Account
{
@Override
protected String doCalculateAccountType() {
return "Certificate of Deposite";
}
@Override
protected double doCalculateInterestRate() {
return 0.065D;
}
}
public class MoneyMarketAccount extends Account
{
@Override
protected String doCalculateAccountType() {
return "Monkey Market";
}
@Override
protected double doCalculateInterestRate() {
return 0.045D;
}
}
public class Client
{
private static Account acct=null;
public static void main(String[] args) {
acct=new MoneyMarketAccount();
System.out.println("Interest from Money Market account"+acct.calculateInterest());
acct=new CDAccount();
System.out.println("Interest from CD account"+acct.calculateInterest());
}
}
浙公网安备 33010602011771号