[设计模式] 模板方法模式


目录




手机用户请​​横屏​​​获取最佳阅读体验,​​REFERENCES​​中是本文参考的链接,如需要链接和更多资源,可以关注其他博客发布地址。


平台

地址



简书

​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


模板方法模式和策略模式



  • 策略模式定义一组算法行为对象,具体行为由算法行为基类的子类实现,调用算法行为的抽象基类只负责调用算法接口中定义的方法。
  • 模板方法模式针对是公共算法的实现,由抽象基类(算法模板)决定方法执行顺序和需要抽象供子类实现的方法。
  • 模板方法通过继承的方式独立管理算法实现,策略模式通过组合的方式,将具体的算法行为委托给指定算法行为对象来实现。


设计要点



  • 好莱坞原则告诉我们,将决策权放在高层模块中,以便于决定如何、何时调用低层模块
  • 策略模式和模板方法模式都是封装算法,前者用组合,后者用继承
  • 工厂方法模式是模板方法的一个特殊的版本

更多


扫码关注​​架构探险之道​​,回复文章标题,获取本文相关源码和资源链接


[设计模式] 模板方法模式_ide_02