【设计模式系列4】详解模板方法模式

设计模式系列总览

设计模式飞机票
三大工厂模式登机入口
策略模式登机入口
委派模式登机入口
模板方法模式登机入口
观察者模式登机入口
单例模式登机入口
原型模式登机入口
代理模式登机入口
装饰者模式登机入口
适配器模式登机入口
建造者模式登机入口
责任链模式登机入口
享元模式登机入口
组合模式登机入口
门面模式登机入口
桥接模式登机入口
中介者模式登机入口
迭代器模式登机入口
状态模式登机入口
解释器模式登机入口
备忘录模式登机入口
命令模式登机入口
访问者模式登机入口
软件设计7大原则和设计模式总结登机入口

什么是模板方法模式

模板方法模式(Template Method Pattern)是指定义一个算法的骨架,并允许子类为一个或者多个步骤提供实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤,属于行为行设计模式。

模板方法模式示例

举个简单的炒蔬菜的例子,我们把炒菜拆分为以下几个步骤:

  1. 放油
  2. 放入蔬菜
  3. 翻炒
  4. 放盐
  5. 放点其他佐料
  6. 出锅

接下来我们就以这个例子来写一个模板方法模式的示例

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. 继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍。
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

双子孤狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值