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

484 阅读7分钟

前言

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

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

本专题的所有案例代码主要以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 ,而具体子类 OnlineOrderOfflineOrder 分别实现了抽象方法 createOrderpayOrderdeliveryOrder 。在客户端代码中,我们创建了一个在线订单和一个线下订单的实例,并对它们进行了处理,输出了各自实现的订单处理流程。

结束语

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

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

相关文章

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

Kafka 专题学习

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

ElasticSearch 专题学习

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

往期并发编程内容推荐

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

博客(阅读体验较佳)