模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法
来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法
模式的用意。在模板模式中,可以将方法分为两大类:模板方法和基本方法
模板方法:一个模板方法是定义在抽象类中的,把基本操作方法组合在一起形成一个总算法或一个总行为的方法。一个抽象类可以
有任意多个模板方法,而不限于一个。每一个模板方法都可以调用任意多个具体方法。
基本方法:①抽象方法:一个抽象方法由抽象类声明,由具体子类实现。在Java语言里抽象方法以abstract关键字标示。
②具体方法:一个具体方法由抽象类声明并实现,而子类并不实现或置换。
③钩子方法:一个钩子方法由抽象类声明并实现,而子类会加以扩展。通常抽象类给出的实现是一个空实现,作为方法的默认实
现。
模板抽象类:
public abstract class Account {
// 模板方法
public final String calculateInterest() {
String moneyName = getMoneyName();
return "This interest of " + moneyName + " in " + getBankName()
+ " is " + getInterest();
}
// 抽象方法
public abstract double getInterest();
public abstract String getMoneyName();
public String getBankName() {
return "ICBC";
}
}
其中包含一个final类型的模板方法,这个方法不能被子类继承改写。同时包含供子类继承使用的抽象方法和子类可以直接使用的具
体方法。
模板1:
public class RMB extends Account {
@Override
public double getInterest() {
// TODO Auto-generated method stub
return 0.12;
}
@Override
public String getMoneyName() {
// TODO Auto-generated method stub
return "RMB";
}
}
模板2:
public class Dollar extends Account {
@Override
public double getInterest() {
// TODO Auto-generated method stub
return 0.14;
}
@Override
public String getMoneyName() {
// TODO Auto-generated method stub
return "dollar";
}
}
Client类:
public class Client {
public static void main(String[] args) {
Account account = new RMB();
System.out.println(account.calculateInterest());
account = new Dollar();
System.out.println(account.calculateInterest());
}
}
最常见的一个模板类是Servlet类,一般来说我们都会使用自己的Servlet类,这个类继承HttpServlet类,并覆盖重写其中的doGet或
者doPost方法。HttpServlet中的service方法即相当于是模板方法,doPost和doGet方法即相当于是基本方法,自己的继承Servlet类
的自定义Servlet相当于基于模板生成的类。