模板方法模式定义:算法
定义一个操做中的算法的框架,而将一些步骤延迟到子类中。使得子类能够不改变一个算法的结构既能够从新定义该算法的某些特定步骤。框架
基本方法也叫作基本操做,是由子类实现,而且在父类的模板方法中调用ide
能够有一个或几个,实现对基本方法的调用,完成固定的逻辑.函数
public abstract class AbstractClass { // 子类去完成.... protected abstract void doAnything() ; // protected abstract void doSomething(); // 模板具体实现 public void templateMethod() { System.out.println( this.getClass().getName()+ "调用模板基类的方法"); /** * 调用基本方法,完成逻辑.... */ this.doAnything(); this.doSomething(); } } public class ConcreteClass1 extends AbstractClass { /* 完成本身的一些事情..... * <p>Title: doAnything</p> * <p>Description: </p> * @see com.spt.pattern.AbstractClass#doAnything() */ @Override protected void doAnything() { // TODO Auto-generated method stub } /* (具体实现 * <p>Title: doSomething</p> * <p>Description: </p> * @see com.spt.pattern.AbstractClass#doSomething() */ @Override protected void doSomething() { // TODO Auto-generated method stub } } public class ConcreteClass2 extends AbstractClass { /* 具体实现..... * <p>Title: doAnything</p> * <p>Description: </p> * @see com.spt.pattern.AbstractClass#doAnything() */ @Override protected void doAnything() { // TODO Auto-generated method stub } /* 具体实现.... * <p>Title: doSomething</p> * <p>Description: </p> * @see com.spt.pattern.AbstractClass#doSomething() */ @Override protected void doSomething() { // TODO Auto-generated method stub } } public class TemplateClient { public static void main(String[] args) { // AbstractClass templateClass1 = new ConcreteClass1(); AbstractClass templateClass2 = new ConcreteClass2(); templateClass1.templateMethod(); templateClass2.templateMethod(); } }
多个子类有公有的方法,而且逻辑基本相同时。this
重要,复杂的算法,能够把核心的算法设计为模板的方法,周边相关的细节功能由各个子类实现。spa
重构时,模板方法模式是一个常用的模式。把相同的的代码抽取到父类中,而后经过钩子函数约束其行为。设计