模板方式很是简单,可是它是一个应用很是普遍的模式。模式中会定义一个操做中的算法骨架,将一些步骤延迟到子类中。模式中仅仅使用Java的继承机制,使得子类能够不改变一个算法的结构便可重定义该算法的某些特定步骤。java
好比咱们定义一个抽象类AbstractClass 也叫抽象模板角色,它的方法分为以下几类:算法
(1)基本方法--抽象的方法框架
基本方法也称为基本操做,是由子类实现的方法,而且在模板中被调用。ide
(2)模板方法测试
模板方法也就是骨架,能够有多个骨架,通常是一个具体方法,实现对基本方法的调度,完成固定的逻辑。为了防止恶意的操做,通常模板方法都加上final关键字,不容许被复写。设计
(3)钩子方法code
钩子方法是由抽象类声明并加以实现。可是子类能够去扩展,子类能够经过扩展钩子方法来影响模板方法的逻辑。抽象类的任务是搭建逻辑的框架,一般由经验丰富的人员编写,由于抽象类的好坏直接影响决定程序的稳定。继承
例如创建一个骨架的演示代码以下所示:钩子
package com.wbx.design; import java.util.Scanner; public abstract class Template { String name = "Laughing"; private Scanner in; //final 不容许子类改动其框架 final public void pre(){ name(); if(is()) other(); //用钩子技术控制是否要这一个other步骤 } public void name(){ System.out.println(name); } public abstract void other(); public boolean is(){ in = new Scanner(System.in); String str = in.nextLine(); if("yes".equals(str)) return true; return false; } }
接下来分别写两个子类,并实现abstract方法。例以下面的演示代码:模板
package com.wbx.design; public class Liu extends Template { @Override public void other() { // TODO Auto-generated method stub System.out.println("Liu"); } }
package com.wbx.design; public class Ju extends Template { @Override public void other() { // TODO Auto-generated method stub System.out.println("ju"); } }
接下来客户端测试
Template l = new Liu(); Template j = new Ju(); l.pre(); j.pre();
结果以下
Laughing yes Liu Laughing yes ju
模版方法的优势及适用场景
容易扩展。通常来讲,抽象类中的模版方法是不易反生改变的部分,而抽象方法是容易反生变化的部分,所以经过增长实现类通常能够很容易实现功能的扩展,符合开闭原则。
便于维护。对于模版方法模式来讲,正是因为他们的主要逻辑相同,才使用了模版方法,假如不使用模版方法,任由这些相同的代码散乱的分布在不一样的类中,维护起来是很是不方便的。
比较灵活。由于有钩子方法,所以,子类的实现也能够影响父类中主逻辑的运行。可是,在灵活的同时,因为子类影响到了父类,违反了里氏替换原则,也会给程序带来风险。这就对抽象类的设计有了更高的要求。
在多个子类拥有相同的方法,而且这些方法逻辑相同时,能够考虑使用模版方法模式。在程序的主框架相同,细节不一样的场合下,也比较适合使用这种模式