一句话:逻辑相同,具体实现不同
1. 使用场景
a. 多个子类有公用的方法,并且逻辑基本相同;
b. 重构,相同的代码抽取到父类
2. 优点
a. 不变的算法封装到父类,变的部分放在子类,扩展方便;
b. 提取公共部分,便于维护;
c. 具体逻辑由父类实现,子类实现具体方法;
3. 缺点
a. 子类的行为对父类产生影响,子类的执行结果影响父类的结果;
b. 对于新手来说,不易阅读;
4. 具体应用
应用非常广泛,如:servlet,struts,mybatis,spring
5. 代码示例
/**
* 模板模式示例,抽象模板类
* @author Mid Lee
* @date 2013-12-01
*/
public abstract class ModelTemplete {
//基本方法尽量为protected类型,符合迪米特法则
protected abstract void method1();
protected abstract void method2();
//防止恶意操作,一般模板方法加上final关键字,不允许覆写
final public void templateMethod(){
this.method1();
this.method2();
}
}
/**
* 具体模板类1
*/
public class ModelTempleteConcrete1 extends ModelTemplete {
@Override
protected void method1() {
System.out.println("Concrete1 method1...");
}
@Override
protected void method2() {
System.out.println("Concrete1 method2...");
}
}
/**
* 具体模板类2
*/
public class ModelTempleteConcrete2 extends ModelTemplete {
@Override
protected void method1() {
System.out.println("Concrete2 method1...");
}
@Override
protected void method2() {
System.out.println("Concrete2 method2...");
}
}
/**
* 模板模式测试类
* 运行结果:
* Concrete1 method1...
* Concrete1 method2...
* Concrete2 method1...
* Concrete2 method2...
* @author Mid Lee
* @date 2013-12-01
*/
public class ModelTempleteTest {
public static void main(String[] args) {
ModelTemplete a = new ModelTempleteConcrete1();
ModelTemplete b = new ModelTempleteConcrete2();
//调用模板方法
a.templateMethod();
b.templateMethod();
}
}
参考资料:
1. 秦小波《设计模式之禅》机械工业社 2010.1