基本需求:

  • 制作豆浆的流程 选材--->添加配料--->浸泡--->放到豆浆机打碎
  • 通过添加不同的配料,可以制作出不同口味的豆浆
  • 选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的
  • 通过模板方法可以完成

基本介绍:

  • 模板方法模式(Template Method),又叫模板模式(Template),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行

  • 模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤,这种类型的设计模式属于行为型模式

  • UML类图(原理)

    • 说明

      • AbstractClass:抽象类,其中的template()为模板方法

        • public final void template() {
          // 在模板方法内部调用其他方法 规定算法的具体流程,这些方法可以是抽象的,也可以不是抽象的
          // 抽象的方法就交由子类实现,子类不改变算法的结构重定义算法的某些步骤
          // 模板方法内部调用自身实现的方法,可作为钩子方法,让子类有选择的去实现
          operation1();
          operation2();
          }
      • ConcreationClass:实现类,对template()方法内部所使用的方法进行实现,对钩子方法可以选择性的实现,不实现则使用父类的实现

  • UML类图(案例)

  • 代码实现

    • public abstract class SoyMilk {
      
         // 模板方法 使用final 不能让子类重写,定义好具体的算法流程,其实现子类去实现
      public final void make() {
      select();
      if (isAdd()) {
      // 使用钩子方法判断是否需要加配料 默认加
      add();
      }
      soak();
      beat();
      } // 添加配料方法 ,不同品种的豆浆,加的配料不一样
      public abstract void add(); // 该方法为钩子方法,子类可根据情况是否实现该方法
      public boolean isAdd() {
      return true;
      } public void select() {
      System.out.println("选择好的新鲜黄豆");
      } public void soak() {
      System.out.println("黄豆和配料开始浸泡,需要3小时");
      } public void beat() {
      System.out.println("黄豆和配料放到豆浆机去打碎");
      } } // 子类一
      class RedBeanSoyMilk extends SoyMilk {
      // 重写添加方法
      @Override
      public void add() {
      System.out.println("添加上好的红豆");
      } } // 子类二
      class PeanutSoyMilk extends SoyMilk {
      // 重写添加方法
      @Override
      public void add() {
      System.out.println("添加上好的花生");
      } } // 子类三
      class PureSoyMilk extends SoyMilk {
      // 重写添加方法 和 钩子方法
      @Override
      public void add() {
      System.out.println("添加上好的花生");
      } @Override
      public boolean isAdd() {
      return false;
      }
      }
    • public class Client {
      public static void main(String[] args) {
      // 制作红豆豆浆 调用模板方法
      SoyMilk redBeanSoyMilk = new RedBeanSoyMilk();
      redBeanSoyMilk.make();
      // 制作花生豆浆 调用模板方法
      SoyMilk peanutSoyMilk = new PeanutSoyMilk();
      peanutSoyMilk.make();
      // 制作纯豆浆 重写了钩子方法 调用模板方法
      SoyMilk pureSoyMilk = new PureSoyMilk();
      pureSoyMilk.make();
      }
      }

spring源码:

  • 在spring的IOC容器中就使用到了模板模式
  • UML类图
    • 说明
      • refresh()方法调用该类很多方法,也就是模板方法
      • obtainFreshBeanFactory()方法内部调用了refreshBeanFactory()和getBeanFactory()方法,这两个方法是抽象方法,交由了子类去完成
      • postProcessBeanFactory()和onRefresh()方法为钩子方法,在AbstractApplicationContext()内部进行了空实现,子类可以有选择的进行重写

注意事项:

  • 基本思想是:算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改
  • 实现了最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接使用
  • 既统一了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤的实现
  • 该模式的不足之处:每一个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大
  • 一般模板方法都加上 final 关键字, 防止子类重写模板方法
  • 模板方法模式使用场景:当要完成在某个过程,该过程要执行一系列步骤 ,这一系列的步骤基本相同,但其个别步骤在实现时可能不同,通常考虑用模板方法模式来处理

13.java设计模式之模板模式的更多相关文章

  1. 图解Java设计模式之模板模式

    图解Java设计模式之模板模式 豆浆制作问题 模板方法模式基本介绍 模板方法模式原理类图 模板方法模式解决豆浆制作问题 模板方法模式的钩子方法 模板方法模式在Spring框架中的源码分析 模板方法模式 ...

  2. JAVA设计模式之模板模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式 ...

  3. Java设计模式之模板模式(Template )

    前言: 最近学习了Glide开源图片缓存框架,在学习到通过使用ModelLoader自定义数据源的时候,Glide巧妙的使用了Java的模板模式来对外暴露处理不同的Url数据源,今天来学习总结一下模板 ...

  4. Java设计模式之模板模式及使用场景

    模板模式,顾名思义,就是通过模板拓印的方式. 定义模板,就是定义框架.结构.原型.定义一个我们共同遵守的约定. 定义了模板,我们的剩余工作就是对其进行充实.丰润,完善它的不足之处. 定义模板采用抽象类 ...

  5. java设计模式之模板模式以及钩子方法使用

    1.使用背景 模板方法模式是通过把不变行为搬到超类,去除子类里面的重复代码提现它的优势,它提供了一个很好的代码复用平台.当不可变和可变的方法在子类中混合在一起的时候, 不变的方法就会在子类中多次出现, ...

  6. 折腾Java设计模式之模板方法模式

    博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...

  7. Java设计模式——装饰者模式

    JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...

  8. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  9. JAVA设计模式--装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...

随机推荐

  1. 使用Navicat远程连接阿里云ECS服务器上的MySQL数据库

    一.必须给服务器的安全组规则设置端口放行规则,在管理控制台中设置: 之后填写配置,授权对象是授权的IP,其中0.0.0.0/0为所有IP授权,之后保存; 二.Navicat使用的配置 在编辑连接处,要 ...

  2. docker在win7下的使用

    1,安装 win7下需要安装docker-toolbox,然后通过Docker Quickstart Terminal运行 2,加速 直接pull的话是拉取的docker hub上的镜像,速度非常慢, ...

  3. Django( 学习第四部 Django的views视)

    目录 视图层 JsonResponse对象 form表单之文件上传 request方法及属性 FBV与CBV JsonResponse对象 前端序列化 JSON.stringify() json.du ...

  4. oracle索引失效情况(转)

    1.隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误.   由于表的字段tu_mdn定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给Orac ...

  5. Redis学习笔记(九)——集群

     一.概述 Redis Cluster与Redis3.0.0同时发布,以此结束了Redis无官方集群方案的时代. Redis Cluster是去中心化,去中间件,也就是说,集群中的每个节点都是平等的关 ...

  6. 使用 beeline 连接 hive 数据库报错处理

    一.beeline连接hive报错 1. User: root is not allowed to impersonate root (state=08S01,code=0) 在初次搭建完hadoop ...

  7. Docker composer搭建Spring Cloud Alibaba 运行环境(二)

    " Spring Cloud Alibaba要用到的组件很多,注册中心nacos, 限流sentinel, 数据库,网关等等.由于用到的组件相对较多,部署会很繁琐,最关键的是没有资源服务器, ...

  8. redis方法-

    //链接错误注意 //1.防火墙 //2.配置文件IP绑定 $redis = new Redis(); //连接redis $redis->connect('127.0.0.1', 6379); ...

  9. FROM DELETE LIBRARY TO RUN の Django路由和视图

    一.requests安装 · requests是什么? request是python实现的简单易使用的http库 · 如何安装? pip install requests ·检测是否成功 import ...

  10. Dubbo 迈出云原生重要一步 - 应用级服务发现解析

    作者 | 刘军(陆龟)  Apache Dubbo PMC 概述 社区版本 Dubbo 从 2.7.5 版本开始,新引入了一种基于实例(应用)粒度的服务发现机制,这是我们为 Dubbo 适配云原生基础 ...