当前位置: 首页 > 后端技术 > Java

深入设计模式-模板法模式

时间:2023-04-02 09:25:45 Java

1.模板方法模式简介二、模板方法模式用代码演示三、总结四、模板方法模式在spring源码中的应用一、模板方法模式简介定义:1)模板方法模式暴露了一个模板,该模板定义了它的方法在抽象类中执行。它的子类可以根据需要重写方法实现,但调用将按照抽象类中定义的方式执行。2)简单来说,模板方法模式就是在一次操作中定义了算法的骨架,将一些步骤延迟给子类,使得子类可以在不改变算法结构的情况下,重新定义算法的一些具体步骤。3)这种类型的设计模式属于行为模式。2、用代码演示模板方法模式假设我们有这样一个共同的需求:积分需求。简单来说,就是用户在消费的时候可以用积分来抵扣,交易成功再用积分进行奖励。这可以应用模板方法模型。我们可以将积分奖励/扣除的步骤分为三步publicinterfaceIIntegralAction{//检查积分/积分前的操作,比如检查账户是否开通,检查用户是否异常,检查奖励/使用号是否异常等voidpreCheck(StringuserId);//执行具体的增减逻辑voidexecute(StringuserId);//执行post逻辑,比如更新数据时间等voidafter(StringuserId);}定义一个抽象类实现这个抽象接口,写前后逻辑,设置调用顺序。publicabstractclassAbstractIntegralActionimplementsIIntegralAction{//到时候子类可以调用这个方法publicvoidexcuteMethod(StringuserId){this.preCheck(userId);this.execute(userId);这个.after(userId);}@OverridepublicvoidpreCheck(StringuserId){//编写前置逻辑System.out.println("执行前置检查逻辑");}@Overridepublicvoidexcute(StringuserId){//交给子类去实现}@Overridepublicvoidafter(StringuserId){//写post逻辑System.out.println("执行post更新逻辑");}}调用方法:publicstaticvoidmain(String[]args){AbstractIntegralActionabstractIntegralAction=newAddIntegeralAction();abstractIntegralAction.excuteMethod("1");}调用结果:此时我们可能会有疑惑,如果我的某个实现类不要pre-check方法怎么办?这时候我们可以使用-----hook方法hook方法介绍:通过一个抽象类来声明和实现。但是子类是可以扩展的,子类可以通过扩展钩子方法来影响模板方法的逻辑。我们添加一个抽象方法:isOpenCheck,然后将这个方法嵌入到模板方法的执行逻辑中。publicabstractclassAbstractIntegralActionimplementsIIntegralAction{//到时候子类可以调用这个方法publicvoidexcuteMethod(StringuserId){//使用hook方法判断是否执行第一步if(isOpenCheck()){this.preCheck(用户名);}this.excute(userId);这个.after(userId);}//钩子方法publicbooleanisOpenCheck(){returntrue;}@OverridepublicvoidpreCheck(StringuserId){//写前置逻辑System.out.println("Executepre-checklogic");}@Overridepublicvoidexecute(StringuserId){//交给子类去实现}@Overridepublicvoidafter(StringuserId){//写入后设置逻辑System.out.println("Executepost-updatelogic");}}如果第一步不需要,子类覆盖后返回false即可。publicclassAddIntegeralActionextendsAbstractIntegralAction{@Overridepublicvoidexecute(StringuserId){System.out.println("加点逻辑执行完毕");}@OverridepublicbooleanisOpenCheck(){//不执行父类检查returnfalse;}}执行结果:3.总结我们完成了模板方法设计模式,大部分人应该都用过,先把一个复杂的任务拆解成几个步骤,然后再抽象出来,把相同的逻辑放在一起,不同的逻辑实现在子类中。模板方法由以下几部分组成:抽象方法:子类需要实现的具体逻辑,每个子类都不一样模板方法:按照给定的执行顺序执行钩子方法:子类可以扩展钩子方法来影响模板方法的逻辑。优点:1)易于扩展,只需要写一个新的类,符合设计原则。2)易于维护,需要更改的代码和不更改的代码明确分开。3)使用灵活,hook方法可以灵活使用4)可读性高,一眼看穿代码结构。4、在spring源码中,我们可以尝试在源码中搜索ConfigurableApplicationContext类,用于模板方法模式的应用。我们可以看到它有很多抽象方法,是不是有点像模板方法?看一下AbstractApplicationContext的实现类:注解是自己打的,有兴趣的可以去我的github下载:https://github.com/su15967456...看一下onRefresh()方法,像这个postProcessBeanFactory就是hook方法,需要自己实现。