定义一个操做中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类能够不改变一个算法的结构便可重定义该算法的某些特定步骤。
这种类型的设计模式属于结构性模式。算法
媒婆有两个徒弟,work() 里面的方法步骤是她给徒弟的平常工做安排
1:找客户
2:根据客户要求,介绍合适的人给客户
3:撮合男女双方见面
……
具体的细节,让徒弟本身扩展设计模式
public abstract class MeiPo { abstract void searchforRequest(); abstract void doing(); abstract void meetManAndMomen(); //模板方法核心,抽取出子类的共性 public final void work(){ //寻找有需求的顾客 searchforRequest(); //根据顾客需求,物色合适对象 doing(); //撮合男女双方 meetManAndMomen(); } }
媒婆1号徒弟的工做安排app
/** * 媒婆1号徒弟,只给女顾客介绍对象 */ public class MeiPoTudi1 extends MeiPo { @Override void searchforRequest() { System.out.println("寻找想找对象的女客户"); } @Override void doing() { System.out.println("给女客户物色合适的男生"); } @Override void meetManAndMomen() { System.out.println("撮合男女双方见面,看女方反馈"); } }
媒婆2号徒弟的工做安排ide
/** * 媒婆2号徒弟,只给男顾客介绍对象 */ public class MeiPoTudi2 extends MeiPo { @Override void searchforRequest() { System.out.println("寻找想找对象的男客户"); } @Override void doing() { System.out.println("给男客户物色合适的女生"); } @Override void meetManAndMomen() { System.out.println("撮合男女双方见面,看男方反馈"); } }
客户端测试测试
public class TemplatePatternTest { public static void main(String[] args) { MeiPo meiPo1 = new MeiPoTudi1(); meiPo1.work(); System.out.println(); MeiPo meiPo2 = new MeiPoTudi2(); meiPo2.work(); } }
这个就是模版方法,将通用的逻辑在抽象类(MeiPo)中抽象出来,具体的步骤在子类中实现spa
Spring源码里面 DispatcherServlet#initStrategies()初始化策略方法设计
protected void initStrategies(ApplicationContext context) { //多文件上传的组件 initMultipartResolver(context); //初始化本地语言环境 initLocaleResolver(context); //初始化模板处理器 initThemeResolver(context); //handlerMapping initHandlerMappings(context); //初始化参数适配器 initHandlerAdapters(context); //初始化异常拦截器 initHandlerExceptionResolvers(context); //初始化视图预处理器 initRequestToViewNameTranslator(context); //初始化视图转换器 initViewResolvers(context); // initFlashMapManager(context); }
一、有多个子类共有的方法,且逻辑相同。 二、重要的、复杂的方法,能够考虑做为模板方法。code
优缺点
优势: 一、封装不变部分,扩展可变部分。 二、提取公共代码,便于维护。 三、行为由父类控制,子类实现。对象
缺点:每个不一样的实现都须要一个子类来实现,致使类的个数增长,使得系统更加庞大。blog