模板方法模式定义:
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构既可以重新定义该算法的某些特定步骤。
- 基本方法:
基本方法也叫做基本操作,是由子类实现,并且在父类的模板方法中调用
- 模板方法:
可以有一个或几个,实现对基本方法的调用,完成固定的逻辑.
- 直接上通用的代码:
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(); } }
- 模板方法使用的场景:
多个子类有公有的方法,并且逻辑基本相同时。
重要,复杂的算法,可以把核心的算法设计为模板的方法,周边相关的细节功能由各个子类实现。
重构时,模板方法模式是一个经常使用的模式。把相同的的代码抽取到父类中,然后通过钩子函数约束其行为。
- 模板模式的扩展: