乐趣区

关于设计模式:深入浅出设计模式模板方法模式

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 就是钩子办法,须要本人本人去实现的。

退出移动版