写点什么

TemplateMethodPattern- 模板方法模式

作者:梁歪歪 ♚
  • 2022 年 6 月 01 日
  • 本文字数:1555 字

    阅读完需:约 5 分钟

TemplateMethodPattern-模板方法模式

模板方法模式

模板方法模式(Template Method Pattern):是指定义一个算法的总体流程步骤,然后允许子类为其中一个或者多个步骤提供特定的实现方式。模板方法模式可以使得子类在不改变算法总体流程的情况下,重新定义算法的某些步骤。模板方法模式属于行为设计模式。


模板方法模式最重要的思想就一句话:封装复用不可变部分(父类),保留可扩展点(子类)。


示例:我们通过炒菜来学习模板方法模式。首先我们先统一一下炒菜的步骤:


  1. 放油

  2. 放入食材(蔬菜)

  3. 翻炒

  4. 放盐

  5. 放其他佐料

  6. 出锅


  • 创建一个抽象炒肉类CookingMeat.java


package cn.liangyy.template;
/** * 抽象炒肉类 */public abstract class CookingMeat { protected final void cooking(){ //1.放油 this.putOil(); //2.放入食材 this.putMeat(); //3.翻炒 this.stirFry(); //4.放盐 this.putSalt(); //5.放佐料(根据实际情况) if (this.needSeasoning()){ this.putSeasoning(); } //6.出锅 this.disUp(); }
//放油 final void putOil(){ System.out.println("倒入适量食用油..."); }
//放入食材 final void putMeat(){ System.out.println("放入食材..."); }
//翻炒 final void stirFry(){ System.out.println("正在翻炒..."); }
//放点盐 final void putSalt(){ System.out.println("放盐..."); }
//放入其他佐料 abstract void putSeasoning();
/** * 钩子方法 * 是否需要佐料,用于流程微调 */ protected boolean needSeasoning(){ return true; }
//出锅 final void disUp(){ System.out.println("好菜出锅..."); }}
复制代码


这个抽象炒肉类中,我们定义了一个炒菜方法cooking(),方法内部定义好了一些步骤,仅仅只留了一个步骤来放到子类中进行微调。其中的needSeasoning()方法,我们将其称之为钩子方法。


钩子方法的主要目的是用来决定是否需要干预执行流程,采用钩子方法可以使得我们的流程更加灵活。钩子方法的返回值一般为使用条件分支语句的返回值(如booleanint等类型)。这个钩子方法并非一定需要,我们也可以不用钩子方法,直接固定预留一些抽象方法到子类实现就可以了。


  • 定义一个炒牛肉类CookingBeef.java


package cn.liangyy.template;
/** * 炒牛肉类 * 假设炒牛肉需要放姜 */public class CookingBeef extends CookingMeat { @Override void putSeasoning() { System.out.println("放点姜..."); }}
复制代码


这个子类里面就实现了 CookingMeat 中的唯一一个抽象方法。


  • 测试


package cn.liangyy.template;
/** * 模板方法-测试类 */public class TestCooking { public static void main(String[] args) { CookingMeat cookingBeef = new CookingBeef(); cookingBeef.cooking(); }}
复制代码


模板方法模式使用场景模板方法模式适用于相对流程比较固定,而大部分步骤又都具有通用性,仅仅需要保留小部分可变动部分交给子类去实现。


模板方法模式优点


  • 由于流程具有通用性,可以将大部分步骤放到父类中实现,这样可以提高代码的复用性

  • 将个性化的步骤留到子类实现,子类可以扩展不同的行为,这也从一定程度上提升了代码的扩展性

  • 因为父类都是封装相对固定的流程,而经常变动的放到子类,我们可以通过扩展子类来实现不同业务场景,而无需修改源码,符合开闭原则


模板方法模式缺点


  • 当变动部分有较多场景时,会导致子类数量不断增加,导致系统更加复杂。

  • 模板方法模式是使用继承来实现的,违反了合成复用原则,一旦流程发生变化导致父类修改,可能所有子类都需要变动。

发布于: 刚刚阅读数: 2
用户头像

梁歪歪 ♚

关注

还未添加个人签名 2021.07.22 加入

还未添加个人简介

评论

发布
暂无评论
TemplateMethodPattern-模板方法模式_设计模式_梁歪歪 ♚_InfoQ写作社区