设计模式(10)模板方法模式

模板方法模式是一种运用十分广泛的设计模式,它定义了一个方法的主体步骤,各个子类可以根据具体业务去自定义的实现各自特殊的步骤。下面是一个简单的例子

我们定义了一个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("未知的子类类型!");
        }
    }
}
Template
public class TemplateChildren1 extends Template {

    @Override
    protected void step2() {
        System.out.println("执行子类1的步骤2");
    }

    @Override
    protected void step3() {
        System.out.println("执行子类1的步骤3");
    }
}
TemplateChildren1
public class TemplateChildren2 extends Template {

    @Override
    protected void step2() {
        System.out.println("执行子类2的步骤2");
    }

    @Override
    protected void step4() {
        System.out.println("执行子类2的步骤4");
    }
}
TemplateChildren2
public enum ChildrenEnum {
    CHILDREN_ONE,

    CHILDREN_TWO;
}
ChildrenEnum

测试

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,是为了防止子类去重写该方法。

模板方法通常和工厂方法放在一起使用,这样子类的创建会更加简单,本例就是使用了简单工厂+模板方法。

当我们在做一个业务的时候,如果这个业务的主流程不变,但是根据各个不同的情况,主流程中的某个子步骤处理方式不同,就可以使用模板方法,定义一套主流程模板,具体的步骤根据子类的业务去进行重写。

使用模板方法的时候需要注意主流程的步骤的抽象,这是很重要的,将主流程抽象出来,变成几个步骤,只要这一步做好,模板方法使用起来就很顺畅了。

原文地址:https://www.cnblogs.com/oeleven/p/10591323.html