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