模板方法模式用于行为的封装,模板规定了一系列方法的执行顺序,要求子类去具体实现这一系列方法,最后不同的子类具有不同的实现,但都完成了模板规定的一系列动作;
下面以活期存款与定期存款的收益,简单的模拟下这个设计模式的使用;
抽象模板:
public abstract class TopTemplate {
public void calculate(Double money){
first(money);
second(money);
}
public abstract void first(Double money);
public abstract void second(Double money);
}
活期存款:
public class CurrentSavings extends TopTemplate{
@Override
public void first(Double money) {
System.out.println("本金加利息:"+money*1.1);
}
@Override
public void second(Double money) {
System.out.println("活期储蓄不分红");
}
}
定期存款:
public class RegularSavings extends TopTemplate{
@Override
public void first(Double money) {
System.out.println("本金加利息:"+money*1.2);
}
@Override
public void second(Double money) {
System.out.println("存款满一年分红"+money*1.2*0.1);
}
}
Client类:
public class Client {
public static void main(String[] args) {
TopTemplate tt1 = new CurrentSavings();
TopTemplate tt2 = new RegularSavings();
tt1.calculate(1000D);
System.out.println("=========");
tt2.calculate(1000D);
}
}
结果:
本金加利息:1100.0
活期储蓄不分红
=========
本金加利息:1200.0
存款满一年分红120.0
可以看到,父类一定是抽象方法,子类一定实现抽象方法,两个子类执行方法的顺序是在抽象父类中规范好的;
与外观模式比较发现, 外观模式是对一系列对象的封装, 模板方法模式是对一系列行为的封装,他们的侧重点不同,但是他们的思路是很相近的,可以比较着进行记忆;
值得注意的是java中Servlet是典型的模板方法模式