什么是模板方法模式
模板方法模式(Template Method Pattern)是指定义一个算法的骨架,并允许子类为一个或者多个步骤提供实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤,属于行为性设计模式。
模板方法模式示例
举个简单的炒蔬菜的例子,我们把炒菜拆分为以下几个步骤:
- 放油
- 放入蔬菜
- 翻炒
- 放盐
- 放点其他佐料
- 出锅
接下来我们就以这个例子来写一个模板方法模式的示例
1、创建一个烹饪蔬菜类(模板模式一般用抽象类来定步骤)
package com.zwx.design.pattern.templete;
public abstract class CookingVegetables {
protected final void cooking(){
//1.放油
this.putOil();
//2.放入蔬菜
this.putVegetables();
//3.翻炒
this.stirFry();
//4.放点盐
this.putSalt();
//5.放入佐料,如果没有就直接起锅了
if (this.needSeasoning()){
this.putSeasoning();
}
//6.起锅
this.dishUp();
}
//放油
final void putOil(){
System.out.println("油下锅了。。。");
}
//放入蔬菜
final void putVegetables(){
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 dishUp(){
System.out.println("菜炒好了,可以起锅了");
}
}
上面这个类中每个步骤都定义了一个方法,但是否是final类型,不允许被继承修改,只有一个步骤:【加入佐料】是抽象的,需要子类去自定义实现,还有一个特别的方法:needSeasoning(),这是一个钩子方法,那么什么是钩子方法呢?
钩子方法的主要目的是用来干预执行流程,使得我们控制行为流程更加灵活,更符合实际业 务的需求。钩子方法的返回值一般为适合条件分支语句的返回值(如 boolean、int 等),钩子方法不是必须的,可以根据实际业务场景确认是否需要
2、创建一个烹饪白菜类继承上面的抽象类
package com.zwx.design.pattern.templete;
public class CookingCabbage extends CookingVegetables {
@Override
void putSeasoning() {
System.out.println("放点姜。。。");
}
}
这个类主要就是实现抽象类中的抽象方法,去自定义实现某一个步骤
3、最后我们可以创建一个测试类类运行一下
package com.zwx.design.pattern.templete;
public class CookingTest {
public static void main(String[] args) {
CookingVegetables cookingVegetables = new CookingCabbage();
cookingVegetables.cooking();
}
}
4、运行结果如下
模板方法模式相对来说是一个比较简单的设计模式,通过这样一个简单的案例,相信大家对模板方法模式会有一个基本的印象
模板方法模式应用场景
1、一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2、各子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复。
模板方法模式优点
1、利用模板方法将相同处理逻辑的代码放到抽象父类中,可以提高代码的复用性。
2、将不同的代码不同的子类中,通过对子类的扩展增加新的行为,提高代码的扩展性。 3、把不变的行为写在父类上,去除子类的重复代码,提供了一个很好的代码复用平台, 符合开闭原则。
模板方法模式缺点
1、类数目的增加,每一个抽象类都需要一个子类来实现,这样导致类的个数增加。
2、类数量的增加,间接地增加了系统实现的复杂度。
3、继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍。
转载:https://blog.csdn.net/zwx900102/article/details/105459032