模板方法模式(Template Method Pattern):是一种应用非常广泛的模式,去除子类中重复的代码,把不变的行为搬到超类去,更好的实现代码的复用
模板方法模式的角色:
- 抽象模板(Abstract Template)角色:定义一个或多个抽象操作,让子类去实现这些抽象操作(这叫基本操作),还需定义一个或多个模板方法,这些模板方法是具体的框架,实现对抽象方法的调度,完成固定的逻辑,让子类的任务只是去实现抽象方法。
- 具体模板(Concrete Template)角色:实现抽象模板中定义的所有抽象方法,可以有多个不同的具体模板角色,每一个具体模板角色都是不同的实现,由此实现模板功能的扩展
这个模式很常用,也很简单,直接代码吧,TALK IS CHEAP,SHOW ME THE CODE.
基础代码实现:
public class TemplateModel {
/*
* 模板方法模式
*/
public static void main(String[] args) {
Template template=new ConcreteTemp();
template.run();
}
}
//抽象模板角色
abstract class Template{
//基本方法—子类实现
protected abstract void operation();
//模板方法
public void run() {
//调用基本方法,完成相关逻辑
operation();
}
}
//具体模板角色
class ConcreteTemp extends Template{
@Override
protected void operation() {
System.out.println("具体模板具体实现");
}
}
运行结果:
具体模板具体实现
模板方法模式实现银行活期和定期账户的利息:
——利息的计算涉及两个步骤:一是确定账户类型(是活期账户还是定期账户);二是确定利息的百分比,这两个方法应抽象到具体模板类中,由具体子类来实现账户类型和利息百分比的输入
import java.math.BigDecimal;
//导包是为了指定输出的数据保留小数位
public class TemplateModel {
/*
* 模板方法模式
*/
public static void main(String[] args) {
Account account;
double act;
//保留小数
BigDecimal bd;
int d=3;//保留小数位数
//活期利息
account=new ConcreteAccountA();
act=account.getAccount();
bd= new BigDecimal(act);
bd=bd.setScale(d,BigDecimal.ROUND_HALF_UP);
System.out.println("活期利息:"+bd);
//定期利息
account=new ConcreteAccountB();
act=account.getAccount();
bd= new BigDecimal(act);
bd=bd.setScale(d,BigDecimal.ROUND_HALF_UP);
System.out.println("定期利息:"+bd);
}
}
//模板方法模式实现银行定期和活期账户的利息
//抽象账户类
abstract class Account{
//基本方法
protected abstract String getAccountNumber();
protected abstract String getAccountType();
protected abstract double getInterestRate();
//根据用户账号和类型从数据库中获取用户金额
private double getAccountBySQL(String accountNumber,String accountType) {
//数据库返回金额
return 5100.00;
}
//模板方法
public double getAccount() {
String accountNumber= getAccountNumber();
String accountType= getAccountType();
double interestRate=getInterestRate();
double account=getAccountBySQL(accountNumber,accountType);
return account*interestRate;
}
}
//具体模板类
//活期
class ConcreteAccountA extends Account{
//用户账号
@Override
protected String getAccountNumber() {
return null;
}
//账号类型
@Override
protected String getAccountType() {
return "活期";
}
//利息百分率
@Override
protected double getInterestRate() {
return 0.0047;
}
}
//定期
class ConcreteAccountB extends Account{
//用户账号
@Override
protected String getAccountNumber() {
return null;
}
//账号类型
@Override
protected String getAccountType() {
return "定期";
}
//利息百分率
@Override
protected double getInterestRate() {
return 0.0332;
}
}
运行结果:
活期利息:23.970
定期利息:169.320
参考书籍:
《大话设计模式》——程杰
《设计模式(Java版)》