1.模板办法模式介绍

2.用代码演示模板办法模式

3.总结

4.在spring源码中,模板办法模式的利用

1.模板办法模式介绍

定义

1)模板办法模式,在一个抽象类中公开定义了它的办法执行的模板,它的子类能够按需重写办法实现,但调用将以抽象类中定义的形式执行。

2)简略地说,模板办法模式定义一个操作中的算法骨架,而将一些步骤提早到子类中,使得子类能够不扭转一个算法的构造,就能够从新定义该算法的某些特定步骤。

3)这种类型的设计模式属于行为模式。

2.用代码演示模板办法模式

假如咱们有这样一个常见的需要:积分需要。简略地来说就是用户在生产的时候能够用积分抵扣金钱,如果交易胜利还能够处分积分,这就能够套用模板办法模式了。

咱们能够将积分处分/扣除的步骤分为三步

public interface IIntegralAction {    //减少/扣除积分前的查看操作,如查看是否开户,检查用户是否异样,查看处分/应用数是否异样等等    void preCheck(String userId);    //执行具体的增减逻辑    void excute(String userId);    //执行后置逻辑,如更新数据工夫等等操作    void after(String userId);}

再定义一个抽象类,来实现这个形象接口,并写好前置和后置的逻辑,设定好调用程序。

public abstract class AbstractIntegralAction implements IIntegralAction {    //到时候子类调用这个办法就能够了    public void excuteMethod(String userId){        this.preCheck(userId);        this.excute(userId);        this.after(userId);    }    @Override    public void preCheck(String userId) {        //写好前置逻辑        System.out.println("执行前置查看逻辑");    }    @Override    public void excute(String userId) {        //交给子类去实现    }    @Override    public void after(String userId) {        //写好后置逻辑        System.out.println("执行后置更新逻辑");    }}

调用办法:

    public static void main(String[] args) {        AbstractIntegralAction abstractIntegralAction = new AddIntegeralAction();        abstractIntegralAction.excuteMethod("1");    }

调用后果:

此时咱们可能有疑难了,如果我某个实现类不想要前置查看办法怎么办?这个时候咱们能够应用-----钩子办法

钩子办法介绍:

由抽象类申明并加以实现。然而子类能够去扩大,子类能够通过扩大钩子办法来影响模版办法的逻辑。

咱们减少一个形象办法:isOpenCheck,而后将该办法嵌入模板办法执行逻辑中。

public abstract class AbstractIntegralAction implements IIntegralAction {    //到时候子类调用这个办法就能够了    public void excuteMethod(String userId){        //应用钩子办法确定是否要执行第一步        if(isOpenCheck()) {            this.preCheck(userId);        }        this.excute(userId);        this.after(userId);    }    //钩子办法    public boolean isOpenCheck(){        return true;    }    @Override    public void preCheck(String userId) {        //写好前置逻辑        System.out.println("执行前置查看逻辑");    }    @Override    public void excute(String userId) {        //交给子类去实现    }    @Override    public void after(String userId) {        //写好后置逻辑        System.out.println("执行后置更新逻辑");    }}

如果不须要第一步,子类笼罩之后返回false就能够了。

public class AddIntegeralAction extends AbstractIntegralAction{    @Override    public void excute(String userId) {        System.out.println("减少积分的逻辑执行了");    }    @Override    public boolean isOpenCheck() {        //不执行父类查看        return false;    }}

执行后果:

3.总结

咱们这就实现了模板办法设计模式,大部分人应该都用过,先将一个简单的工作拆解成几个步骤,而后形象进去,把雷同的逻辑放在一起,不同的逻辑放在子类实现。

模板办法有以下几个局部组成:

形象办法:须要子类去实现的具体逻辑,每个子类都不一样
模板办法:依照给定的执行程序来进行执行
钩子办法:子类能够通过扩大钩子办法来影响模版办法的逻辑。

长处:

1)容易扩大,只须要新写类就行了,合乎设计准则。
2)便于保护,须要变动的代码和不变的代码拆散地清清楚楚。
3)灵便应用,应用钩子办法能够灵便应答
4)可读性高,一眼就能看穿代码的架构。

4.在spring源码中,模板办法模式的利用

咱们能够尝试着在源码中搜寻一下

ConfigurableApplicationContext 这个类

咱们能够看出,它领有很多形象办法

是不是有点模板办法的滋味了?

再看看AbstractApplicationContext这个实现类:

注解是我本人敲的,有趣味的能够去我的github上下载:

https://github.com/su15967456...

咱们看一下onRefresh() 这个办法,

像这个postProcessBeanFactory就是钩子办法,须要本人本人去实现的。