03-JAVA设计模式-模板方法模式

模板方法模式

什么是模板方法

模板方法模式(Template Method Pattern)在Java中是一种行为型设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。

模板方法模式的结构

  • 抽象类(Abstract Class):
    • 定义了一个或多个抽象操作。
    • 定义了一个模板方法,它调用了这些抽象操作。
  • 具体子类(Concrete Subclass):
    • 实现抽象类中定义的抽象操作。
    • 继承抽象类并可以调用模板方法以执行算法。

优点:

  • 代码复用:模板方法定义了算法的骨架,因此相同的代码不需要在多个地方重复编写。
  • 算法结构清晰:通过将算法分解为一系列步骤,模板方法使得算法结构清晰,易于理解。
  • 扩展性:子类可以通过实现不同的抽象操作来扩展算法的行为,而无需改变算法的整体结构。
  • 灵活性:模板方法模式允许在算法的不同部分之间进行灵活的组合。

缺点:

  • 子类数量增加:如果算法中的步骤很多,并且它们都可能被子类覆盖,那么可能会导致子类数量急剧增加,从而增加系统的复杂性。
  • 不易于进行大的变动:如果模板方法中的某个步骤不适合作为抽象方法,那么就无法通过子类来修改它,这可能会限制算法的灵活性。
  • 可能导致违反开闭原则:如果抽象类定义得不够稳定,经常需要修改,那么每次修改都可能影响到所有的子类。

案例

在银行办理业务时,一般通过取号-> 办理业务 -> 评价,通过模板方法实现银行办理不同业务

UML

实现步骤:

  • 定义银行办理业务类,类中定义通用的final方法(不允许子类覆盖),对外调用的处理方法,以及变化的抽象方法接口
  • 定义不同的业务实现,通过继承实现变化的抽象方法接口

实现代码

Business.java

java 复制代码
// 业务
public abstract class Business {

    public final void offerNumber(){
        System.out.println("取号");
    }

    // 办理业务抽象方法
    public abstract void handleBsiness();

    public final void evaluate(){
        System.out.println("评价");
    }

    public final void handle(){
        offerNumber();
        handleBsiness();
        evaluate();
    }
}

EnterpriseBusiness.java

java 复制代码
// 企业业务
public class EnterpriseBusiness extends Business{
    @Override
    public void handleBsiness() {
        System.out.println("办理企业业务");
    }
}

PersonalBusiness.java

java 复制代码
// 个人业务
public class PersonalBusiness extends Business{
    @Override
    public void handleBsiness() {
        System.out.println("办理个人业务");
    }
}

TestClient.java

java 复制代码
public class TestClient {
    public static void main(String[] args) {
        Business business = new PersonalBusiness();
        business.handle();
    }
}

执行结果:

gitee源码

git clone https://gitee.com/dchh/JavaStudyWorkSpaces.git

相关推荐
阿伟*rui31 分钟前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel
XiaoLeisj2 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck2 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei2 小时前
java的类加载机制的学习
java·学习
Yaml44 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~4 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616884 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
aloha_7895 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot
记录成长java5 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
睡觉谁叫~~~6 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust