共计 2459 个字符,预计需要花费 7 分钟才能阅读完成。
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 就是钩子办法,须要本人本人去实现的。