来源:《设计模式之禅》java
定义:算法
定义一个操做中的算法框架,将一些步骤延迟到子类中,使得子类能够不改变一个算法的结构便可从新定义该算法的某些步骤。设计模式
抽象模板方法能够分为两类:框架
基本方法:由子类定义,在模板方法中调用。ide
模板方法:定义算法的步骤。通常模板方法添加final关键字,不容许被复写。函数
类图:this
代码:设计
抽象模板:code
/** * */ package cc.pattern.template; /** * @author rico * 抽象模板类 */ public abstract class AbstractClass { /** * 基本方法 */ protected abstract void doAction1(); /** * 基本方法 */ protected abstract void doAction2(); /** * 模板方法,调用基本方法 */ final public void templateAction() { this.doAction1(); this.doAction2(); } }
具体模板1:
io
/** * */ package cc.pattern.template; /** * @author rico * 具体模板1 */ public class ConcreteClass extends AbstractClass { /* (non-Javadoc) * @see cc.pattern.template.AbstractClass#doAction1() */ @Override protected void doAction1() { System.out.println("###doAction1"); } /* (non-Javadoc) * @see cc.pattern.template.AbstractClass#doAction2() */ @Override protected void doAction2() { System.out.println("###doAction2"); } }
具体模板2:
/** * */ package cc.pattern.template; /** * @author rico * 具体模板2 */ public class ConcreteClass2 extends AbstractClass { /* (non-Javadoc) * @see cc.pattern.template.AbstractClass#doAction1() */ @Override protected void doAction1() { System.out.println("###doAction1"); } /* (non-Javadoc) * @see cc.pattern.template.AbstractClass#doAction2() */ @Override protected void doAction2() { System.out.println("###doAction2"); } }
场景:
/** * */ package cc.pattern.template; /** * @author rico * */ public class Client { /** * @param args */ public static void main(String[] args) { AbstractClass clazz1 = new ConcreteClass(); AbstractClass clazz2 = new ConcreteClass2(); System.out.println("###Clazz1"); clazz1.templateAction(); System.out.println("###Clazz2"); clazz2.templateAction(); } }
模板方法模式优势:
封装不变部分,扩张可变部分。
提取公共代码部分,便于维护。
行为由父类控制,之类实现。
模板方法模式缺点:
子类的执行结果影响父类,带来代码阅读难度。
使用场景:
多个子类公有方法,而且逻辑基本相同。
重要/复杂的核心算法抽象为模板方法,各个子类实现相关的细节。
用于重构,把相同的方法抽取到父类中,经过钩子函数约束行为。
扩展: