模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中,模板方法是的子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模板方法模式结构:
TemplateClass:抽象类,实现了一个模板方法,定义了一个或多个抽象的方法,定义并实现了一个模板方法,这个模板方法一般是具体方法,他给出了一个顶级逻辑的骨架,即定义了算法的骨架,具体子类将重写父类中的抽象方法,以实现一个算法的步骤;
ConcreteClass:继承 TemplateClass,实现父类中的抽象方法,以完成算法中与特定子类相关的步骤。每一个 TemplateClass都可以有任意多个ConcreteClass与之对应,而每一个ConcreteClass都可以按需求完成不同的实现,从而使得顶级逻辑的实现各不相同。
结构代码如下:
1、抽象类:
package abstracttemplate; /** * Created by Administrator on 2017/8/5. */ public abstract class AbstractClass { public abstract void primitiveOperationA(); public abstract void primitiveOperationB(); public void templateMethod(){ primitiveOperationA(); primitiveOperationB(); } }
2、具体逻辑类
package concreteclass; import abstracttemplate.AbstractClass; /** * Created by Administrator on 2017/8/5. */ public class ConcretePlanNumA extends AbstractClass { public void primitiveOperationA() { System.out.println("A 计划"); } public void primitiveOperationB() { System.out.println("B 计划"); } }
package concreteclass; import abstracttemplate.AbstractClass; /** * Created by Administrator on 2017/8/5. */ public class ConcretePlanNumB extends AbstractClass { public void primitiveOperationA() { System.out.println("C 计划"); } public void primitiveOperationB() { System.out.println("D 计划"); } }
3、测试类:
import abstracttemplate.AbstractClass; import concreteclass.ConcretePlanNumA; import concreteclass.ConcretePlanNumB; import org.junit.Test; /** * Created by Administrator on 2017/8/5. */ public class TestTemplateMethod { @Test public void testMethod(){ AbstractClass abstractClass; abstractClass = new ConcretePlanNumA(); abstractClass.templateMethod(); abstractClass = new ConcretePlanNumB(); abstractClass.templateMethod(); } }
由于这个模式并不难,所以就没再写更具体的例子来分析了。
模板方法模式特点:模板方法模式是通过把不变的行为转移到父类中,去除子类中的重复性代码来体现它的优势,所以,模板方法模式相当于是提供了一个很好的代码复用平台。
下面引用小菜和大鸟的对话来完成模板方法模式的总结:有些时候,我们会遇到由一系列步骤构建成的过程需要执行,这个过程从高层次上看是相同的,但有些步骤的实现可能不同,这时候,我们通常就应该考虑使用模板方法设计模式了。这种情况下当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现,我们通过模板方法模式把这些行为搬移到单一的地方,这样做就能帮助子类摆脱重复的不变行为的纠缠。
嗯,模板方法模式到这里基本就介绍完了。