什么是模板方法设计模式:(引用大话设计模式中的解释)
定义一个操作中算法的骨架,而将这些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。(很抽象有木有啊)
简单说:就是做一件事的步骤是不变的(算法骨架不变),但是具体的细节是可变的(每一步的具体实现是可以改变的)。
以简单的mvc开发模式为例:
通常情况下我们使用mvc开发模式时,项目的三层骨架(controller,service,dao)是不变的,变的是每层包下的各个类的名字。
模板类:
public abstract class TemplateMethod {
//这三个方法是基本方法
protected abstract void controller();
protected abstract void service();
protected abstract void dao();
//模板方法
public final void mvcTemplate(){
controller();
service();
dao();
}
}
//模板类的具体实现
public class UserTemplate extends TemplateMethod {
@Override
protected void controller() {
System.out.println("我是userController");
}
//基本方法的实现
@Override
protected void service() {
System.out.println("我是userService");
}
@Override
protected void dao() {
System.out.println("我是userDao");
}
}
//模板类的具体实现
public class DeptTemplate extends TemplateMethod {
@Override
protected void controller() {
System.out.println("我是deptController");
}
@Override
protected void service() {
System.out.println("我是deptService");
}
@Override
protected void dao() {
System.out.println("我是deptDao");
}
}
//测试类
public class TestTemplate {
public static void main(String[] args) {
TemplateMethod userTemplate=new UserTemplate();
userTemplate.mvcTemplate();
DeptTemplate deptTemplate=new DeptTemplate();
deptTemplate.mvcTemplate();
}
}
模板方法设计模式的优缺点:
优点:
把不变的部分封装起来,扩展可变的部分。把不变的步骤封装到父类,可变具体实现交给子类。
缺点:
每个不同的实现都需要定义一个类,会造成类的数量过多,使系统过于庞大。