作者:翔未央图_971 | 来源:互联网 | 2024-11-04 14:01
模板方法模式是一种行为设计模式,通过定义一个操作中的算法骨架,将具体步骤的实现延迟到子类中。本文详细解析了模板方法模式的类图结构、实现方式以及挂钩机制,并结合实际案例进行了深入探讨。此外,文章还提供了丰富的参考资料,帮助读者更好地理解和应用这一设计模式。对于手机用户,建议横屏阅读以获得更佳的阅读体验。
[设计模式] 模板方法模式
目录
手机用户请横屏
获取最佳阅读体验,REFERENCES
中是本文参考的链接,如需要链接和更多资源,可以关注其他博客发布地址。
平台 |
地址 |
---|
CSDN |
https://blog.csdn.net/sinat_28690417 |
简书 |
https://www.jianshu.com/u/3032cc862300 |
个人博客 |
https://yiyuery.github.io/NoteBooks/ |
模板方法模式:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的具体实现步骤
类图
实现
//定义算法模板
public abstract class AbsractTemplate {
/**
* 准备工作
*/
void prepare(){
step1();
step2();
step3();
step4();
}
void step1(){
System.out.println("step1 completed!");
}
void step2(){
System.out.println("step2 completed!");
}
abstract void step3();
abstract void step4();
}
抽象类方法交由子类实现,抽象类模板中负责组织方法间调用的依赖和顺序管理。
public class HandlerOne extends AbsractTemplate {
@Override
void step3() {
System.out.println("HandlerOne step3");
}
@Override
void step4() {
System.out.println("HandlerOne step4");
}
}
public class HandlerTwo extends AbsractTemplate {
@Override
void step3() {
System.out.println("HandlerTwo step3");
}
@Override
void step4() {
System.out.println("HandlerTwo step4");
}
}
挂钩
抽象父类中还可以定义钩子函数,来由子类进行覆盖实现,可以用来控制方法的调用链的每个节点是否执行。
public abstract class AbsractTemplate {
/**
* 准备工作
*/
void prepare(){
step1();
step3();
step4();
if(hook()){
step2();
}
}
void step1(){
System.out.println("step1 completed!");
}
void step2(){
System.out.println("step2 completed!");
}
abstract void step3();
abstract void step4();
//钩子
boolean hook(){
return false;
}
}
子类实现覆盖钩子函数
public class HandlerThree extends AbsractTemplate {
@Override
boolean hook() {
return true;
}
@Override
void step3() {
System.out.println("HandlerThree step3");
}
@Override
void step4() {
System.out.println("HandlerThree step4");
}
}
总结
模板方法模式
- 高层组件(抽象基类)决定方法调用逻辑,对待底层实现类的方式是“别调用我们,我们会调用你”(好莱坞原则)
- 避免高层和低层组件相互交叉依赖的“依赖腐败”问题发生。
- 在高层组件中定义方法的调用逻辑,在低层组件中通过挂钩函数的覆盖实现来控制节点执行的条件控制。
- 定义算法步骤后,将步骤的实现延迟在子类(低层组件)决定如何实现算法的具体步骤。
- 为代码重用提供了一种方案。
- 模板方法的抽象类可以定义具体的方法,抽象方法和钩子
- 钩子是一种方法,它在抽象类中不做事,只做默认的事,子类可以选择要不要覆盖它,主要用于高层组件在角色方法的调用步骤时使用。
- 为防止子类修改算法模板的方法,可以将模板方法声明为final
模板方法模式和策略模式
- 策略模式定义一组算法行为对象,具体行为由算法行为基类的子类实现,调用算法行为的抽象基类只负责调用算法接口中定义的方法。
- 模板方法模式针对是公共算法的实现,由抽象基类(算法模板)决定方法执行顺序和需要抽象供子类实现的方法。
- 模板方法通过继承的方式独立管理算法实现,策略模式通过组合的方式,将具体的算法行为委托给指定算法行为对象来实现。
设计要点
- 好莱坞原则告诉我们,将决策权放在高层模块中,以便于决定如何、何时调用低层模块
- 策略模式和模板方法模式都是封装算法,前者用组合,后者用继承
- 工厂方法模式是模板方法的一个特殊的版本
更多
扫码关注架构探险之道
,回复文章标题,获取本文相关源码和资源链接
知识星球(扫码加入获取历史源码和文章资源链接)