JAVA设计模式之模板方法模式
概念:
模板方法模式(template method),模板方法定义一个操作中的算法骨架,将某些步骤延迟到子类中实现。这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤。
在某些类的算法中,用了相同的方法,造成代码的重复。控制子类扩展,子类必须遵守算法规则。
角色
抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。
应用
- 数据库访问的封装
- Junit单元测试
- servlet中关于doGet和doPost方法调用
- Hibernate中的模版程序
- spring中JDBCTemplate、HibernateTemplate等
代码
public abstract class BankTemplateMethod {
public void takeNumber() {
System.out.println("take number");
}
// 钩子方法
public abstract void transact();
public void evaluate() {
System.out.println("反馈");
}
// 模板方法,子类不重写, final
public final void process() {
this.takeNumber();
// 类似钩子,子类实现
this.transact();
this.evaluate();
}
}
public class DrawMoney extends BankTemplateMethod {
@Override
public void transact() {
System.out.println("get money");
}
}
public class Main {
public static void main(String[] args) {
BankTemplateMethod btm = new DrawMoney();
btm.process();
// 匿名内部类
BankTemplateMethod btm2 = new BankTemplateMethod() {
@Override
public void transact() {
System.out.println("save monsy");
}
};
btm2.process();
}
}
总结
优点
模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。
子类实现算法的某些细节,有助于算法的扩展。
通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。
缺点
每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。