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

相关推荐
沉鱼.4435 分钟前
第十二届题目
java·前端·算法
赫瑞1 小时前
数据结构中的排列组合 —— Java实现
java·开发语言·数据结构
周末也要写八哥3 小时前
多进程和多线程的特点和区别
java·开发语言·jvm
惜茶3 小时前
vue+SpringBoot(前后端交互)
java·vue.js·spring boot
杰克尼4 小时前
springCloud_day07(MQ高级)
java·spring·spring cloud
NHuan^_^5 小时前
SpringBoot3 整合 SpringAI 实现ai助手(记忆)
java·人工智能·spring boot
Mr_Xuhhh6 小时前
从ArrayList到LinkedList:理解链表,掌握Java集合的另一种选择
java·数据结构·链表
错把套路当深情6 小时前
Java 全方向开发技术栈指南
java·开发语言
han_hanker6 小时前
springboot 一个请求的顺序解释
java·spring boot·后端
MaCa .BaKa6 小时前
44-校园二手交易系统(小程序)
java·spring boot·mysql·小程序·maven·intellij-idea·mybatis