模板方法模式:类的行为模式。一个抽象类,将部分逻辑以具体方法以及具体构造的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。它包括轮廓和具体逻辑,轮廓即为模板方法,具体逻辑为基本方法。
模板方法:定义在抽象类中,把基本操作方法组合在一起形成一个总的行为,由子类不加修改地完全继承下来。一个抽象类 可以有多个模板方法,一个模板方法可以调用任意多个具体方法。
基本方法:分为抽象方法、具体方法、钩子方法;具体方法由抽象类声明并实现,有些能起到工厂方法的作用。钩子方法由抽象类声明并实现,而子类回加以扩展。通常抽象类给出的是一个空实现或默认实现。
角色:
抽象模板角色:定义一个活多个抽象操作(基本操作),一边让子类实现;定义并实现一个模板方法。模板方法一般是一个具体方法,他给出了轮廓的骨架,而其中的逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。
具体模板角色:实现父类所定义的一个或多个抽象方法,他们是一个轮廓的组成步骤;每个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法的不同实现,从而使得轮廓的实现各不相同。
先来个例子:
package cn.design.pattern.demo.templatemethod.demo.interesrate;
public abstract class Account {
protected String accountNum;
public Account() {
accountNum = null;
}
public Account(String accountNum) {
this.accountNum = accountNum;
}
/**
* 模板方法
* @return
*/
protected final double calculateRest() {
double insertRate = doCalculateInterRate();
String accountType = doCalculateAccountType();
double amount = calculateAmount(accountType, accountNum);
return amount * insertRate;
}
/**
* 两个基本方法, 由子类实现
* @return
*/
protected abstract String doCalculateAccountType();
protected abstract double doCalculateInterRate();
/**
* 基本方法,已经实现
* @param accountType
* @param accountNum
* @return
*/
protected final double calculateAmount(String accountType, String accountNum) {
// 可能读取数据库数据
return 12334D;
}
}
package cn.design.pattern.demo.templatemethod.demo.interesrate;
public class MarketAccount extends Account {
@Override
protected String doCalculateAccountType() {
return null;
}
@Override
protected double doCalculateInterRate() {
return 0;
}
}
package cn.design.pattern.demo.templatemethod.demo.interesrate;
public class CDAccount extends Account {
@Override
protected String doCalculateAccountType() {
return null;
}
@Override
protected double doCalculateInterRate() {
return 0;
}
}
在我们之前接触到得HttpServlet,正是用了模板方法模式:service方法是模板方法,其中调用doXXX方法,而doXXX方法则由子类实现具体业务。