前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >06-01-设计模式 模板方法模式

06-01-设计模式 模板方法模式

作者头像
彼岸舞
发布2022-05-28 09:29:10
1490
发布2022-05-28 09:29:10
举报
文章被收录于专栏:java开发的那点事

豆浆制作问题

编写制作豆浆的程序,说明如下:

  1. 制作豆浆的流程选材--->添加配料--->浸泡--->放到豆浆机打碎
  2. 通过添加不同的配料,可以制作出不同口味的豆浆
  3. 选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的
  4. 请使用模板方法模式完成(说明:因为模板方法模式,比较简单,很容易就想到这个方案,因此就直接使用,不再使用传统的方案来引出模板方法模式)

模板方法模式

基本介绍

  1. 模板方法模式(TemplateMethodPattern),又叫模板模式(TemplatePattern),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。
  2. 简单说,模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤
  3. 这种类型的设计模式属于行为型模式。

原理类图

对原理类图的说明-即(模板方法模式的角色及职责)

  1. AbstractClass抽象类,类中实现了模板方法(template),定义了算法的骨架,具体子类需要去实现其它的抽象方法operationr2,3,4
  2. ConcreteClass实现抽象方法operationr2,3,4,以完成算法中特点子类的步骤

模板方法模式解决豆浆制作问题

应用实例

编写制作豆浆的程序,说明如下:

制作豆浆的流程选材--->添加配料--->浸泡--->放到豆浆机打碎

通过添加不同的配料,可以制作出不同口味的豆浆

选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的(红豆、花生豆浆。。。)

类图

代码实现

代码语言:javascript
复制
package com.flower.template;

public class TestMain {
    public static void main(String[] args) {
        SoyMilk redBeanSoyMilk = new RedBeanSoyMilk();
        SoyMilk peanutSoyMilk = new PeanutSoyMilk();
        redBeanSoyMilk.make();
        peanutSoyMilk.make();
    }
}
abstract class SoyMilk {
    
    /**
    * 模板方法
    */
    final void make(){
        // 顺序调用
        select();
        addCondiments();
        soak();
        beat();
    }
    
    // 选择材料
    void select(){
        System.out.println("选择上好的黄豆!");
    }
    
    // 抽象方法 添加辅料
    abstract void addCondiments();
    
    // 浸泡
    void soak(){
        System.out.println("浸泡");
    }
    
    void beat(){
        System.out.println("研磨打碎");
    }
}
class RedBeanSoyMilk extends SoyMilk{
    @Override
    void addCondiments() {
        System.out.println("加入上好的红豆");
    }
}
class PeanutSoyMilk extends SoyMilk{
    @Override
    void addCondiments() {
        System.out.println("加入上好的花生");
    }
}

模板方法模式的钩子方法

  1. 在模板方法模式的父类中,我们可以定义一个方法,它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为“钩子”。
  2. 还是用上面做豆浆的例子来讲解,比如,我们还希望制作纯豆浆,不添加任何的配料,请使用钩子方法对前面的模板方法进行改造
代码语言:javascript
复制
package com.flower.template;

public class TestMain {
    public static void main(String[] args) {
        SoyMilk redBeanSoyMilk = new RedBeanSoyMilk();
        SoyMilk peanutSoyMilk = new PeanutSoyMilk();
        redBeanSoyMilk.make();
        peanutSoyMilk.make();
        SoyMilk pureSoyMilk = new PureSoyMilk();
        pureSoyMilk.make();
    }
}
abstract class SoyMilk {
    
    protected boolean isAdd;
    
    public SoyMilk(boolean isAdd) {
        this.isAdd = isAdd;
    }
    
    public SoyMilk() {
        this.isAdd = true;
    }
    
    /**
    * 模板方法
    */
    final void make(){
        // 顺序调用
        select();
        if(isAdd){
            addCondiments();
        }
        soak();
        beat();
    }
    
    // 选择材料
    void select(){
        System.out.println("选择上好的黄豆!");
    }
    
    // 抽象方法 添加辅料
    abstract void addCondiments();
    
    // 浸泡
    void soak(){
        System.out.println("浸泡");
    }
    
    void beat(){
        System.out.println("研磨打碎");
    }
}
class RedBeanSoyMilk extends SoyMilk{
    public RedBeanSoyMilk() {
        super(true);
    }
    
    @Override
    void addCondiments() {
        System.out.println("加入上好的红豆");
    }
}
class PeanutSoyMilk extends SoyMilk{
    public PeanutSoyMilk() {
        super(true);
    }
    
    @Override
    void addCondiments() {
        System.out.println("加入上好的花生");
    }
}
abstract class NoCondimentsSoyMilk extends SoyMilk{
    public NoCondimentsSoyMilk() {
        super(false);
    }
    
    void addCondiments(){
        
    };
}
class PureSoyMilk extends NoCondimentsSoyMilk{
    
}

源码剖析

Spring源码

SpringIOC容器初始化时运用到的模板方法模式

类图

模板方法模式的注意事项和细节

  1. 基本思想是:算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改
  2. 实现了最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接使用。
  3. 既统一了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤的实现。
  4. 该模式的不足之处:每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大
  5. 一般模板方法都加上final关键字,防止子类重写模板方法.
  6. 模板方法模式使用场景:当要完成在某个过程,该过程要执行一系列步骤,这一系列的步骤基本相同,但其个别步骤在实现时可能不同,通常考虑用模板方法模式来处理
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 豆浆制作问题
  • 模板方法模式
    • 基本介绍
      • 原理类图
      • 模板方法模式解决豆浆制作问题
        • 应用实例
          • 类图
            • 代码实现
            • 模板方法模式的钩子方法
            • 源码剖析
              • Spring源码
              • 模板方法模式的注意事项和细节
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档