Java设计模式之模板方法模式

本文介绍了模板方法模式的概念、应用场景和实现方式,以豆浆制作过程为例,展示了如何通过模板方法模式实现不同口味豆浆的制作。在模板方法模式中,父类定义了算法骨架,子类可重写部分细节。此外,还讨论了模板方法模式的钩子机制,并给出了在Spring框架中模板方法模式的应用。最后,总结了模板方法模式的优点和适用场景,强调了代码复用和灵活性的平衡。
摘要由CSDN通过智能技术生成

模板方法模式

1. 简介

  1. 模板方法模式又称模板模式。指在一个抽象类中定义了使用它的方法的模板,子类可以按需实现某些方法,但是方法的执行还是按照抽象类中定义的顺序【模板】进行。
  2. 换言之,模板方法模式规定了一个操作的算法骨架,而部分细节实现则可以延迟到子类实现。该模式在保证算法骨架的不变性的同时,为其中的细节实现提供了可变性。
  3. 该模式属于行为型模式。

2.场景设定

  1. 豆浆制作有固定的步骤:选材==》添加配料==》浸泡==》放到豆浆机打碎。
  2. 除了添加配料在不同口味豆浆中的操作不一样外,其他步骤在每次制作过程中都是一样的。
  3. 通过模板方法模式设计豆浆制作过程

3. 实现

3.1 类关系图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ddx1lX86-1621606978252)(resource/1621603394818.png)]

3.2 SoyaMilk抽象类

/**
 * @author: zipeng Li
 * 2021/5/21  21:08
 */
public abstract class SoyaMilk {
    /**
     * 豆浆制作函数
     * 使用 final 修饰,防止子类重写该方法
     */
    public final void make(){
        selectSoya();
        addCondiments();
        soak();
        beat();
    }

    /**
     * 步骤 1:选材
     */
    public void selectSoya(){
        System.out.println("选择上好的黄豆。。。");
    }

    /**
     * 步骤 2:添加配料
     * 该方法为抽象方法,需要子类重写
     */
    public abstract void addCondiments();

    /**
     * 步骤 3:浸泡
     */
    public void soak(){
        System.out.println("材料开始浸泡。。。。");
    }

    /**
     * 步骤 4:打碎
     */
    public void beat(){
        System.out.println("放入豆浆机搅拌。。。");
    }
}

3.3 具体豆浆类

/**
 * @author: zipeng Li
 * 2021/5/21  21:17
 */
public class PeanutSoyaMilk extends SoyaMilk{
    @Override
    public void addCondiments() {
        System.out.println("添加美味的花生酱。。。");
    }
}

/**
 * @author: zipeng Li
 * 2021/5/21  21:19
 */
public class SugarSoyaMilk extends SoyaMilk{
    @Override
    public void addCondiments() {
        System.out.println("添加美味的糖果...");
    }
}

3.4 客户端类

/**
 * @author: zipeng Li
 * 2021/5/21  21:20
 */
public class Client {
    public static void main(String[] args) {
        SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
        // 制作花生豆浆
        peanutSoyaMilk.make();

        SoyaMilk sugarSoyaMilk = new SugarSoyaMilk();
        // 制作糖果豆浆
        sugarSoyaMilk.make();
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1AYhrpf2-1621606978261)(resource/1621603490879.png)]

4. 模板方法模式中的钩子

  1. 在模板方法模式的抽象类中,可以定义一个方法【其子类看需求要不要重写该方法】,该方法称为钩子
  2. 如,若现在需要制作纯豆浆,即不需要执行步骤2,使用钩子解决该需求。
// 1. 抽象类 SoyaMilk 添加方法
/**
 * 钩子,决定是否需要添加配料
 */
public boolean isAddCondiments(){
  return true;
}

// 2. 抽象类 SoyaMilk 修改make()方法
/**
 * 豆浆制作函数
 * 使用 final 修饰,防止子类重写该方法
 */
public final void make(){
  selectSoya();
  if (isAddCondiments()){
    addCondiments();
  }
  soak();
  beat();
}

// 3. 增加纯豆浆类
/**
 * @author: zipeng Li
 * 2021/5/21  21:31
 */
public class PureSoyaMilk extends SoyaMilk{
    @Override
    public void addCondiments() {

    }

    @Override
    public boolean isAddCondiments() {
        return false;
    }
}

5. 在Spring中的应用

  1. Spring IOC 容器初始化的时候,使用了模板方法模式。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mrqt9Gvy-1621606978272)(resource/1621606260170.png)]

6. 总结

  1. 模板方法模式的基本思想是:算法骨架只存在特定父类中。当需要变更算法骨架,则只需要修改一处。
  2. 实现了代码复用的最大化。
  3. 提供了很大的灵活性,父类的算法骨架保证了整体的统一性,子类的可以实现部分细节,保证了细节的灵活性。
  4. 缺点:每一个不同的实现都需要一个子类,可能导致类过多。
  5. 一般模板方法都会加上final关键字,防止子类重写模板方法。
  6. 使用场景:若某个过程包含一些列相同的步骤,且只在个别步骤的实现上有所差别,通常考虑使用模板方法来实现。

后序

  • 我是一名大三本科生,专业是软件工程【一本】。目前,正在准备找实习以及秋招,意向岗位是Java后端开发工程师。为此,在码云托管了一个项目,以整理我所有所学知识。涉及内容:计算机网络、操作系统、Java基础、主流Java后端框架、设计模式、Web前端框架等内容。欢迎大家访问我的开源项目编程之路
  • 码云地址:https://gitee.com/alizipeng/the-way-of-programming
  • 以上内容均记载在我的开源项目中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值