作者:Three-Kobe | 来源:互联网 | 2023-10-09 21:30
目录
1 模板模式(Template)
2 抽象Template类
3 具体Template类
3.1 TemplateA类
3.2 TemplateB类
3.3 TemplateC类
3.4 TemplateD类
4 调试代码
5 调试结果
注:
1 模板模式(Template)
意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
主要解决:一些方法通用,却在每一个子类都重新写了这一方法。
何时使用:有一些通用的方法。
如何解决:将这些通用算法抽象出来。
关键代码:在抽象类实现,其他步骤在子类实现。
应用实例: 1、在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异。 2、西游记里面菩萨定好的 81 难,这就是一个顶层的逻辑骨架。 3、spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。
优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。
缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
使用场景: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。
注意事项:为防止恶意操作,一般模板方法都加上 final 关键词。
2 抽象Template类
package com.xudongbase.designpattern.template;/*** 模板(Template) 模式抽象Template类** @author xudongmaster*/
public abstract class CommonTemplate {/*** 生成模板*/public final void createTemplate() {System.out.println("开始生成模板");//通用逻辑commonLogic();//特殊逻辑specialLogic();System.out.println("结束生成模板\n");}/*** 通用逻辑*/protected final void commonLogic() {System.out.println("这是通用逻辑");}/*** 特殊逻辑*/protected abstract void specialLogic();
}
3 具体Template类
3.1 TemplateA类
package com.xudongbase.designpattern.template;import org.springframework.stereotype.Component;/*** 模板(Template) 模式具体Template类A** @author xudongmaster*/
@Component("TemplateA")
public class TemplateA extends CommonTemplate {/*** 特殊逻辑*/@Overridepublic void specialLogic() {System.out.println("这是模板A的特殊逻辑");}
}
3.2 TemplateB类
package com.xudongbase.designpattern.template;import org.springframework.stereotype.Component;/*** 模板(Template) 模式具体Template类B** @author xudongmaster*/
@Component("TemplateB")
public class TemplateB extends CommonTemplate {/*** 特殊逻辑*/@Overridepublic void specialLogic() {System.out.println("这是模板B的特殊逻辑");}
}
3.3 TemplateC类
package com.xudongbase.designpattern.template;import org.springframework.stereotype.Component;/*** 模板(Template) 模式具体Template类C** @author xudongmaster*/
@Component("TemplateC")
public class TemplateC extends CommonTemplate {/*** 特殊逻辑*/@Overridepublic void specialLogic() {System.out.println("这是模板C的特殊逻辑");}
}
3.4 TemplateD类
package com.xudongbase.designpattern.template;import org.springframework.stereotype.Component;/*** 模板(Template) 模式具体Template类D** @author xudongmaster*/
@Component("TemplateD")
public class TemplateD extends CommonTemplate {/*** 特殊逻辑*/@Overridepublic void specialLogic() {System.out.println("这是模板D的特殊逻辑");}
}
4 调试代码
package com.xudongbase.designpattern;import com.xudongbase.designpattern.template.CommonTemplate;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.Map;@SpringBootTest
public class TemplateTest {@Autowiredprivate Map templateMap;/*** 测试模板模式*/@Testpublic void testTemplate(){//生成模板AtemplateMap.get("TemplateA").createTemplate();//生成模板BtemplateMap.get("TemplateB").createTemplate();//生成模板CtemplateMap.get("TemplateC").createTemplate();//生成模板DtemplateMap.get("TemplateD").createTemplate();}
}
5 调试结果
注:
(1)具体Template类的调用使用了策略模式。
(2) 需要查看源码请前往Gitee的xudongbase项目design_pattern分支。
xudongbase: 主要是项目中可以用到的共通方法 - Gitee.comhttps://gitee.com/xudong_master/xudongbase/tree/design_pattern/