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

模板方法模式

1.什么是模板方法
  • 模板方法模式:定义一个操作中的算法骨架(父类),而将一些步骤延迟到子类中。 模板方法使得子类可以不改变一个算法的结构来重定义该算法的
2.什么时候使用模板方法

实现一些操作时,整体步骤很固定,但是呢。就是其中一小部分需要改变,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。

3.实际开发中应用场景哪里用到了模板方法

其实很多框架中都有用到了模板方法模式

例如:数据库访问的封装、Junit单元测试、servlet中关于doGet/doPost方法的调用等等

4.现实生活中的模板方法

例如:

去餐厅吃饭,餐厅给我们提供了一个模板就是:看菜单,点菜,吃饭,付款,走人 (这里 "点菜和付款" 是不确定的由子类来完成的,其他的则是一个模板。)

5.代码实现模板方法模式
  1. 先定义一个模板。把模板中的点菜和付款,让子类来实现
java 复制代码
package com.lijie;
//模板方法
public abstract class RestaurantTemplate {
 // 1.看菜单
public void menu() {
  System.out.println("看菜单");
 }
 // 2.点菜业务
abstract void spotMenu();
 // 3.吃饭业务
public void havingDinner(){ System.out.println("吃饭"); }
 // 3.付款业务
abstract void payment();
 // 3.走人
public void goR() { System.out.println("走人"); }
 //模板通用结构
public final void process(){
  menu();
  spotMenu();
  havingDinner();
  payment();
  goR();
 }
}

2、模板方法子类1

java 复制代码
package com.lijie;
public class RestaurantGinsengImpl extends RestaurantTemplate {
 void spotMenu() {
   System.out.println("人参");
 }
 void payment() {
   System.out.println("5快");
 }
}

2、模板方法子类2

java 复制代码
package com.lijie;
public class RestaurantLobsterImpl extends RestaurantTemplate {
 void spotMenu() {
   System.out.println("龙虾");
 }
 void payment() {
   System.out.println("50块");
 }
}

客户端测试

java 复制代码
package com.lijie;

public class Client {
 public static void main(String[] args) {
   //调用第一个模板实例
	RestaurantTemplate restaurantTemplate = new RestaurantGinsengImpl();
    restaurantTemplate.process();
 }
}
6模板方法模式的注意事项和细节
  1. 基本思想是:算法只存在于一个地方,也就是在父类中,容易修改.需要修改算法时,只要修改父类的模板方 法或者已经实现的某些步骤,子类就会继承这些修改
  2. 实现了最大化代码复用.父类的模板方法和已实现的某些步骤会被子类继承而直接使用.
  3. 既统一了算法,也提供了很大的灵活性.父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步 骤的实现.
  4. 该模式的不足之处:每个不同的实现都需要一个子类实现,导致类的个数增加,使得系统更加庞大
  5. 一般模板方法都加上 final 关键字, 防止子类重写模板方法.
  6. 模板方法模式使用场景:当要完成在某个过程,该过程要执行一系列步骤 ,这一系列的步骤基本相同,但其 个别步骤在实现时 可能不同,通常考虑用模板方法模式来处理
相关推荐
腾渊信息科技公司16 分钟前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地1 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
莫逸风4 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
z123456789864 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
yaoxin5211235 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python
做个文艺程序员5 小时前
Linux第24篇:Java应用监控体系搭建:Prometheus+Grafana可视化运维
java·grafana·prometheus
小钻风33666 小时前
Spring Boot 文件上传详解:深入理解 MultipartFile 的使用与原理
java·开发语言
其美杰布-富贵-李6 小时前
Spring Boot 工程开发全流程说明
java·spring boot·后端
前端双越老师8 小时前
如何以前端视角(非0基础)学 Java ?
java·node.js·全栈
dear_bi_MyOnly8 小时前
【SpringBoot配置文件】
java·spring boot·后端·学习·spring·java-ee·学习方法