TemplateMethodPattern- 模板方法模式
模板方法模式
模板方法模式(Template Method Pattern):是指定义一个算法的总体流程步骤,然后允许子类为其中一个或者多个步骤提供特定的实现方式。模板方法模式可以使得子类在不改变算法总体流程的情况下,重新定义算法的某些步骤。模板方法模式属于行为设计模式。
模板方法模式最重要的思想就一句话:封装复用不可变部分(父类),保留可扩展点(子类)。
示例:我们通过炒菜来学习模板方法模式。首先我们先统一一下炒菜的步骤:
放油
放入食材(蔬菜)
翻炒
放盐
放其他佐料
出锅
创建一个抽象炒肉类
CookingMeat.java
这个抽象炒肉类中,我们定义了一个炒菜方法cooking()
,方法内部定义好了一些步骤,仅仅只留了一个步骤来放到子类中进行微调。其中的needSeasoning()
方法,我们将其称之为钩子方法。
钩子方法的主要目的是用来决定是否需要干预执行流程,采用钩子方法可以使得我们的流程更加灵活。钩子方法的返回值一般为使用条件分支语句的返回值(如boolean
和int
等类型)。这个钩子方法并非一定需要,我们也可以不用钩子方法,直接固定预留一些抽象方法到子类实现就可以了。
定义一个炒牛肉类
CookingBeef.java
这个子类里面就实现了 CookingMeat 中的唯一一个抽象方法。
测试
模板方法模式使用场景模板方法模式适用于相对流程比较固定,而大部分步骤又都具有通用性,仅仅需要保留小部分可变动部分交给子类去实现。
模板方法模式优点
由于流程具有通用性,可以将大部分步骤放到父类中实现,这样可以提高代码的复用性
将个性化的步骤留到子类实现,子类可以扩展不同的行为,这也从一定程度上提升了代码的扩展性
因为父类都是封装相对固定的流程,而经常变动的放到子类,我们可以通过扩展子类来实现不同业务场景,而无需修改源码,符合开闭原则
模板方法模式缺点
当变动部分有较多场景时,会导致子类数量不断增加,导致系统更加复杂。
模板方法模式是使用继承来实现的,违反了合成复用原则,一旦流程发生变化导致父类修改,可能所有子类都需要变动。
版权声明: 本文为 InfoQ 作者【梁歪歪 ♚】的原创文章。
原文链接:【http://xie.infoq.cn/article/dd46d5ab3abecaf2a972c6d28】。文章转载请联系作者。
评论