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. 模板方法模式使用场景:当要完成在某个过程,该过程要执行一系列步骤 ,这一系列的步骤基本相同,但其 个别步骤在实现时 可能不同,通常考虑用模板方法模式来处理
相关推荐
小薛博客3 小时前
22、Jenkins容器化部署Java应用
java·运维·jenkins
西贝爱学习3 小时前
如何在 IntelliJ IDEA 中进行全局替换某个字段(或文本)
java·ide·intellij-idea
南部余额3 小时前
Spring 基于注解的自动化事务
java·spring·自动化
alf_cee3 小时前
通过Idea 阿里插件快速部署java jar包
java·ide·intellij-idea
小蜗牛在漫步3 小时前
23种设计模式-Proxy模式
设计模式·代理模式
坚持每天敲代码3 小时前
【教程】IDEA中导入springboot-maven工程
java·maven·intellij-idea
CodeCraft Studio3 小时前
国产化PDF处理控件Spire.PDF教程:如何在 Java 中通过模板生成 PDF
java·python·pdf·spire.pdf·java创建pdf·从html创建pdf
阿方.9184 小时前
《数据结构全解析:栈(数组实现)》
java·开发语言·数据结构
YC运维4 小时前
Ansible题目全解析与答案
java·算法·ansible
程序员清风4 小时前
贝壳一面:年轻代回收频率太高,如何定位?
java·后端·面试