一句话:逻辑相同,具体实现不同
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