模板方法模式
模板方法模式是类的行为模式。定义一个操作中的算法框架,将一些步骤延迟到子类中实现。使得子类可以改变一个算法的结构即可重定义该算法的特定步骤。
模板方法需要开发抽象和子类设计师之间的写作,这就相当于一个总设计师负责给出一个算法和逻辑,而其他的设计师则给出这个算法逻辑的具体实现。
模板方法模式的角色
- 抽象模板(Abstract Template)角色:该角色定义了一个或多个抽样操作,以便子类去实现;这些操作是基本操作,是一个顶级逻辑的组成步骤。还需要定义并实现一个或多个模板方法,这些模板方法一般是具体方法,即一个框架,实现对基本方法的调度,完成固定的逻辑;
- 具体模板(Concrete Template)角色:该角色实现抽象模板中定义的一个或多个抽样模板方法,每一个抽象模板角色可以有任意多个具体模板角色与之对应,而每一个具体模板橘色都可以而给出这个抽象方法的不同实现,从而使顶级的实现各不相同。
模板方法模式优点
- 封装不变的部分,扩展可变的部分。不变的部分封装到父类总实现,而可变部分则可以通过继承进行扩展;
- 提取公共代码,便于维护。将公共部分的代码抽取到父类中,维护时只需要修改父类中的代码;
- 行为由父类控制,子类实现。模板方法的基本方法是由子类实现的,因此子类可以通过扩展增加相应的功能,符合开闭原则。
<span style="font-size:18px;">package template;
//抽象模板,抽象账户类
public abstract class Account {
//账号
private String accountNumber;
//基本方法,确定账户的类型,留给子类实现
protected abstract String getAccountType();
//基本方法,确定利息,留给子类实现
protected abstract double getInterestRate();
//基本方法,根据账户类型和账号确定账户金额
public double calculate(String accountType,String accountNumber){
//省去逻辑
return 32323.2332D;
}
//模板方法,计算账户利息
public double interest(){
String accoutType = getAccountType();
double interestRate = getInterestRate();
double amount = calculate(accoutType,accountNumber);
return amount * interestRate;
}
}
</span>
<span style="font-size:18px;">package template;
public class DemandAcount extends Account{
@Override
protected String getAccountType(){
return "DEMAND";
}
@Override
protected double getInterestRate() {
// TODO Auto-generated method stub
return 0.005D;
}
}
</span>
<span style="font-size:18px;">package template;
//具体模板,定期账户
public class FixedAcount extends Account{
@Override
protected String getAccountType(){
return "ONE_YEAR";
}
@Override
protected double getInterestRate() {
// TODO Auto-generated method stub
return 0.035D;
}
}
</span>
<span style="font-size:18px;">package template;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Account account = new DemandAcount();
System.out.println("活期利息:"+account.interest());
account = new FixedAcount();
System.out.println("定期利息:"+account.interest());
}
}
</span>