一起来学设计模式之模板方法模式

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 前言目前正在出一个设计模式专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~本节给大家讲一下设计模式中的模板方法模式,并结合实际业务场景给大家讲解如何使用~本专题的所有案例代码主要以Java语言为主, 好了, 废话不多说直接开整吧~模板方法模式模版方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个操作中算法的骨架(通常是一个抽象类),而将一些步骤延迟到子类中实现,使得子类在不改变算法结构的情况下,可以重新定义算法的某些步骤。在模版方法模式中,定义了一个抽象类(AbstractClass),其中包含一个模版方法(templateMeth

前言

目前正在出一个设计模式专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~

本节给大家讲一下设计模式中的模板方法模式,并结合实际业务场景给大家讲解如何使用~

本专题的所有案例代码主要以Java语言为主, 好了, 废话不多说直接开整吧~

模板方法模式

模版方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个操作中算法的骨架(通常是一个抽象类),而将一些步骤延迟到子类中实现,使得子类在不改变算法结构的情况下,可以重新定义算法的某些步骤。

在模版方法模式中,定义了一个抽象类(AbstractClass),其中包含一个模版方法(templateMethod),该方法定义了算法的骨架,而某些步骤则由具体子类(ConcreteClass)来实现,子类可以重写这些步骤来实现不同的算法。

// 抽象类 AbstractClass
abstract class AbstractClass {
    // 模版方法 templateMethod,定义算法骨架
    public final void templateMethod() {
        step1();
        step2();
        step3();
    }
     // 步骤1,抽象方法,由子类实现
    abstract void step1();
     // 步骤2,抽象方法,由子类实现
    abstract void step2();
     // 步骤3,抽象方法,由子类实现
    abstract void step3();
}
 // 具体子类 ConcreteClass1
class ConcreteClass1 extends AbstractClass {
    // 实现步骤1
    void step1() {
        System.out.println("ConcreteClass1: step1");
    }
     // 实现步骤2
    void step2() {
        System.out.println("ConcreteClass1: step2");
    }
     // 实现步骤3
    void step3() {
        System.out.println("ConcreteClass1: step3");
    }
}
 // 具体子类 ConcreteClass2
class ConcreteClass2 extends AbstractClass {
    // 实现步骤1
    void step1() {
        System.out.println("ConcreteClass2: step1");
    }
     // 实现步骤2
    void step2() {
        System.out.println("ConcreteClass2: step2");
    }
     // 实现步骤3
    void step3() {
        System.out.println("ConcreteClass2: step3");
    }
}
 // 客户端代码 Client
public class Client {
    public static void main(String[] args) {
        AbstractClass object1 = new ConcreteClass1();
        object1.templateMethod();
         AbstractClass object2 = new ConcreteClass2();
        object2.templateMethod();
    }
}

输出:

ConcreteClass1: step1
ConcreteClass1: step2
ConcreteClass1: step3
ConcreteClass2: step1
ConcreteClass2: step2
ConcreteClass2: step3

以上代码中, AbstractClass  是抽象类,定义了模版方法 templateMethod 和三个抽象方法 step1 、 step2  和  step3。具体子类  ConcreteClass1 和  ConcreteClass2 继承自 AbstractClass,实现了三个抽象方法。

在客户端代码中,我们分别创建了  ConcreteClass1 和  ConcreteClass2 的实例,调用它们的模版方法  templateMethod ,输出了各自实现的三个步骤。

最佳实践

电商平台在下单流程中可以使用模版方法模式来实现订单处理流程:

// 抽象类 Order
public abstract class Order {
    // 模版方法,定义订单处理流程
    public final void processOrder() {
        createOrder();
        payOrder();
        deliveryOrder();
    }
     // 创建订单,由具体子类实现
    abstract void createOrder();
     // 支付订单,由具体子类实现
    abstract void payOrder();
     // 发货,由具体子类实现
    abstract void deliveryOrder();
}
 // 具体子类 OnlineOrder
public class OnlineOrder extends Order {
    // 实现创建订单
    void createOrder() {
        System.out.println("Online order created");
    }
     // 实现支付订单
    void payOrder() {
        System.out.println("Online order paid and confirmed");
    }
     // 实现发货
    void deliveryOrder() {
        System.out.println("Online order delivered through courier");
    }
}
 // 具体子类 OfflineOrder
public class OfflineOrder extends Order {
    // 实现创建订单
    void createOrder() {
        System.out.println("Offline order created");
    }
     // 实现支付订单
    void payOrder() {
        System.out.println("Offline order paid");
    }
     // 实现发货
    void deliveryOrder() {
        System.out.println("Offline order delivered through physical store");
    }
}
 // 客户端代码 Client
public class Client {
    public static void main(String[] args) {
        Order onlineOrder = new OnlineOrder();
        onlineOrder.processOrder();
         Order offlineOrder = new OfflineOrder();
        offlineOrder.processOrder();
        // Online order created
        // Online order paid and confirmed
        // Online order delivered through courier
        // Offline order created
        // Offline order paid
        // Offline order delivered through physical store
    }
}

在这个例子中,抽象类 Order 定义了订单处理流程的模版方法  processOrder ,而具体子类 OnlineOrder  和  OfflineOrder  分别实现了抽象方法  createOrderpayOrder  和  deliveryOrder 。在客户端代码中,我们创建了一个在线订单和一个线下订单的实例,并对它们进行了处理,输出了各自实现的订单处理流程。

结束语

设计模式其实并不难,大家在学习的时候一定要在理解的基础上去写代码,不要去背代码。下节给大家讲访问者模式~

本着把自己知道的都告诉大家,如果本文对您有所帮助,点赞+关注鼓励一下呗~

相关文章

项目源码(源码已更新 欢迎star⭐️)

Kafka 专题学习

项目源码(源码已更新 欢迎star⭐️)

ElasticSearch 专题学习

项目源码(源码已更新 欢迎star⭐️)

往期并发编程内容推荐

推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)

博客(阅读体验较佳)


























相关文章
|
6月前
|
设计模式 算法
二十三种设计模式全面解析-深入解析模板方法模式的奇妙世界
二十三种设计模式全面解析-深入解析模板方法模式的奇妙世界
|
设计模式 存储 算法
行为型设计模式02-模板方法模式
行为型设计模式02-模板方法模式
50 0
|
设计模式 算法
设计模式9 - 模板方法模式【Template Method Pattern】
设计模式9 - 模板方法模式【Template Method Pattern】
37 0
|
设计模式 算法 Java
设计模式~模板方法模式(Template method)-10
目录 (1)优点: (2)缺点: (3)使用场景: (4)注意事项: (5)应用实例: (6)Servlet Api &
57 0
|
2月前
|
设计模式 算法 Java
Java设计模式-模板方法模式(14)
Java设计模式-模板方法模式(14)
|
4月前
|
设计模式 JavaScript 算法
js设计模式【详解】—— 模板方法模式
js设计模式【详解】—— 模板方法模式
48 6
|
5月前
|
设计模式 算法 关系型数据库
设计模式第七讲-外观模式、适配器模式、模板方法模式详解
系统要求所有的数据库帮助类必须实现ISqlHelp接口,面向该接口编程,如SQLServerHelp类。 此时第三方提供了一个新的MySql的帮助类(假设是dll,不能修改),它的编程规范和ISqlHelp不兼容,这个时候就需要引入适配器类,使二者能相互兼容。
170 0
|
6月前
|
设计模式 算法 Java
Java 设计模式:深入模板方法模式的原理与应用
【4月更文挑战第27天】模板方法模式是一种行为设计模式,主要用于定义一个操作中的算法的框架,允许子类在不改变算法结构的情况下重定义算法的某些特定步骤。
60 1
|
6月前
|
设计模式 Go
[设计模式 Go实现] 行为型~模板方法模式
[设计模式 Go实现] 行为型~模板方法模式
|
6月前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    54
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    38
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    62
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    57
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    41
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    50
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    106
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    78