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