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

相关推荐
小叶lr19 分钟前
idea 配置 leetcode插件 代码模版
java·leetcode·intellij-idea
qq_4298565723 分钟前
idea启动服务报错Application run failed
java·ide·intellij-idea
瑞雨溪25 分钟前
java中的this关键字
java·开发语言
J不A秃V头A33 分钟前
Redisson 中开启看门狗(watchdog)机制
java·分布式锁·看门狗
草字35 分钟前
uniapp input限制输入负数,以及保留小数点两位.
java·前端·uni-app
李迟36 分钟前
某Linux发行版本无法使用nodejs程序重命名文件问题的研究
java·linux·服务器
MapleLea1f1 小时前
26届JAVA 学习日记——Day14
java·开发语言·学习·tcp/ip·程序人生·学习方法
没有黑科技1 小时前
基于web的音乐网站(Java+SpringBoot+Mysql)
java·前端·spring boot
爪哇学长1 小时前
解锁API的无限潜力:RESTful、SOAP、GraphQL和Webhooks的应用前景
java·开发语言·后端·restful·graphql
刘大浪1 小时前
IDEA 2024安装指南(含安装包以及使用说明 cannot collect jvm options 问题 四)
java