- 在JAVA中用到了很多设计模式,我们常用的Servlet类利用了一个模板方法来实现,在处理客户端请求时不用管是具体调用了POST或GET请求,这个类会自己进行判断,具体实现需要我们自己实现。
- 它是应用于这样一种场景,当我们要完成某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理.
- 比如在Servlet类的实现上,里面有很多的方法doPost()/doGet()等等,它们之间的调用顺序已经被定义好了,具体的实现由它的子类来实现。因为每个请求是不同的但它们调用的方法相同,不同的实现由子类来完成。
- Java 代码
package com.bjpowernode.pattern; /** * 抽象类,模板 * @author LLS * */ public abstract class AbstractClass { public static final String METHOD_1="m1"; public static final String METHOD_2="m2"; //模板方法 public final void templateMethod(String methodName) { if (METHOD_1.equals(methodName)) { doOperater1(methodName); } if (METHOD_2.equals(methodName)) { doOperater2(methodName); } } //具体方法1 protected abstract void doOperater1(String methodName); //具体方法2 protected abstract void doOperater2(String methodName); }
package com.bjpowernode.pattern; /** * 具体实现类 * @author LLS * */ public class ConcreteClass extends AbstractClass {
@Override protected void doOperater1(String methodName) { System.out.println("concrete--operater1"+methodName); }
@Override protected void doOperater2(String methodName) { System.out.println("concrete--operater1"+methodName); }
}
package com.bjpowernode.pattern;
public class test {
/** * 测试模板方法 * @param args */ public static void main(String[] args) { AbstractClass a=new ConcreteClass(); a.templateMethod(AbstractClass.METHOD_1); }
}
- 模板方法模式是通过把不变的行为搬到超类,去除子类中的重复代码来体现它的优势 。 它提供了一个很好的代码服用平台,因为有时候我们会遇到由一系列步骤构成的过程需要执行,从这个过程高层次看是相同的,但有些步骤的实现可能不同。
- 当不变的和可变的行为在方法的子类实现中混在一起的时候,不变的行为在子类中重复出现,我们通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类摆脱重复的不变行为的纠缠。