设计模式模板方法模式
Posted oeleven
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式模板方法模式相关的知识,希望对你有一定的参考价值。
模板方法模式是一种运用十分广泛的设计模式,它定义了一个方法的主体步骤,各个子类可以根据具体业务去自定义的实现各自特殊的步骤。下面是一个简单的例子
我们定义了一个template的抽象模板类,其中主方法中执行了四个步骤,其中步骤2是各个子类都不同的,也是各个子类都需要实现的方法,所以定义为抽象方法,步骤1、步骤3、步骤4则是根据各个子类的具体业务去选择实现某些方法。
下面是代码
public abstract class Template { public final void mainFunction() { this.step1(); this.step2(); this.step3(); this.step4(); } protected void step1() { System.out.println("执行步骤1"); } protected abstract void step2(); protected void step3() { } protected void step4() { System.out.println("执行步骤4"); } public static Template getTemplateChildren(ChildrenEnum childrenType) throws Exception { switch (childrenType) { case CHILDREN_ONE: return new TemplateChildren1(); case CHILDREN_TWO: return new TemplateChildren2(); default: throw new Exception("未知的子类类型!"); } } }
public class TemplateChildren1 extends Template { @Override protected void step2() { System.out.println("执行子类1的步骤2"); } @Override protected void step3() { System.out.println("执行子类1的步骤3"); } }
public class TemplateChildren2 extends Template { @Override protected void step2() { System.out.println("执行子类2的步骤2"); } @Override protected void step4() { System.out.println("执行子类2的步骤4"); } }
public enum ChildrenEnum { CHILDREN_ONE, CHILDREN_TWO; }
测试
public static void main(String[] args) throws Exception { Template template1 = Template.getTemplateChildren(ChildrenEnum.CHILDREN_ONE); template1.mainFunction(); System.out.println("---------------------------------------------"); Template template2 = Template.getTemplateChildren(ChildrenEnum.CHILDREN_TWO); template2.mainFunction(); }
测试结果
上述例子中,我们在父类模板中实现了步骤1、步骤4,因为只有部分子类需要做步骤3,所以将在父类中定义了一个空的方法,由需要这一步的子类去实现具体的方法。
父类中的主方法我们定义为final,是为了防止子类去重写该方法。
模板方法通常和工厂方法放在一起使用,这样子类的创建会更加简单,本例就是使用了简单工厂+模板方法。
当我们在做一个业务的时候,如果这个业务的主流程不变,但是根据各个不同的情况,主流程中的某个子步骤处理方式不同,就可以使用模板方法,定义一套主流程模板,具体的步骤根据子类的业务去进行重写。
使用模板方法的时候需要注意主流程的步骤的抽象,这是很重要的,将主流程抽象出来,变成几个步骤,只要这一步做好,模板方法使用起来就很顺畅了。
以上是关于设计模式模板方法模式的主要内容,如果未能解决你的问题,请参考以下文章