模板方法模式(Template Method)
定义
定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
UML类图
例子
AbstractClass
package com.csdhsm.pattemdesign.template; /** * @Title: Templete.java * @Description: 模板父类,包含子类相同部分,子类自己完成的部分 * @author: Han * @date: 2016年6月21日 下午10:03:44 */ public abstract class Templete { //每个子类相同的执行方法 public void topOperation() { beforeOperation(); operation(); afterOperation(); } //每个子类不同的地方,延迟到子类去完成 public abstract void operation(); //已经定义好的方法,写在父类,避免重复 private final void beforeOperation() { System.out.println("This acton before the operation!"); } private final void afterOperation() { System.out.println("This acton after the operation!"); } }
模板方法1
package com.csdhsm.pattemdesign.template; /** * @Title: TempleteMethod1.java * @Description: 模板方法1 * @author: Han * @date: 2016年6月21日 下午10:01:35 */ public class TempleteMethod1 extends Templete { @Override public void operation() { System.out.println("I`m Templete Method 1"); } }
模板方法2
package com.csdhsm.pattemdesign.template; /** * @Title: TempleteMethod2.java * @Description: 模板方法2 * @author: Han * @date: 2016年6月21日 下午10:02:02 */ public class TempleteMethod2 extends Templete { @Override public void operation() { System.out.println("I`m Templete Method 2"); } }
客户端
package com.csdhsm.pattemdesign.template; public class Solution { public static void main(String[] args) { Templete templete1 = new TempleteMethod1(); Templete templete2 = new TempleteMethod2(); templete1.topOperation(); templete2.topOperation(); } }
结果
OK,成功。
总结
模板方法模式是通过把不变的行为搬移到父类(原则:不写一句重复的代码),出去子类中的重复代码,体现优势。模板方法提供了一个很好的代码服用的模板。