【玩转23种Java设计模式】行为型模式篇:模板模式

2023-07-27 21:14:45 浏览数 (1)

软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

汇总目录链接:【玩转23种Java设计模式】学习目录汇总整理

一、简介

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

  角色:

  • 抽象类(Abstract Class):抽象类定义了算法的框架,其中包含一个或多个抽象方法和模板方法。抽象方法用于延迟到子类实现的具体步骤,而模板方法定义了算法的框架,其中包含一系列的步骤,这些步骤可以是具体方法或抽象方法。
  • 具体类(Concrete Class):具体类是抽象类的子类,它实现了抽象方法,完成算法的具体步骤。

二、实例

文件处理,公共下载和公共读取,特定处理数据。

1、模板抽象类(AbstractTemplate)

代码语言:javascript复制
@Slf4j
public abstract class AbstractTemplate {
    public void execute(String filePath) {

        download(filePath);

        read(filePath);

        deal(filePath);
    }

    public void download(String filePath) {
        log.info("公共下载:{}", filePath);
    }

    public void read(String filePath) {
        log.info("公共读取:{}", filePath);
    }

    public abstract void deal(String filePath);
}

2、文件服务类1(OneFileService )

代码语言:javascript复制
@Slf4j
public class OneFileService extends AbstractTemplate {
    @Override
    public void deal(String filePath) {
        log.info("OneFileService 处理数据:{}", filePath);
    }
}

3、文件服务类2(TwoFileService )

代码语言:javascript复制
@Slf4j
public class TwoFileService extends AbstractTemplate {
    @Override
    public void deal(String filePath) {
        log.info("TwoFileService 处理数据:{}", filePath);
    }
}

4、测试类(Main)

代码语言:javascript复制
public class Main {
    public static void main(String[] args) {
        OneFileService oneFileService = new OneFileService();
        oneFileService.execute("D:\test.txt");
    }
}

5、后台输出

代码语言:javascript复制
公共下载:D:test.txt
公共读取:D:test.txt
OneFileService 处理数据:D:test.txt

三、总结

1、优点

  • 固定的算法框架,降低了算法的设计和实现的复杂度。
  • 提供了一种简单的扩展和定制算法的方式,通过子类可以灵活地实现算法中的具体步骤,同时保持了算法的整体结构的稳定性。
  • 通过抽象父类和具体子类的分离,提高了代码的可维护性和可复用性,减少了重复代码的编写。

2、缺点

  • 如果模板方法本身需要的改动较多,可能需要修改抽象父类或者大量的子类,导致系统的扩展性变差。
  • 如果算法的步骤太多或者过于复杂,可能会导致模板方法变得庞大,不易维护。

3、应用场景

  • 算法的结构固定,但是某些具体步骤的实现可能变化。
  • 多个类具有相似的行为。
  • 需要控制算法的执行流程。
  • 提供一个框架或工具的扩展点。

0 人点赞