前言
目前正在出一个设计模式专题
系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~
本节给大家讲一下设计模式中的模板方法模式
,并结合实际业务场景给大家讲解如何使用~
本专题的所有案例代码主要以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
分别实现了抽象方法 createOrder
、 payOrder
和 deliveryOrder
。在客户端代码中,我们创建了一个在线订单和一个线下订单的实例,并对它们进行了处理,输出了各自实现的订单处理流程。
结束语
设计模式其实并不难,大家在学习的时候一定要在理解的基础上去写代码,不要去背代码。下节给大家讲访问者模式
~
本着把自己知道的都告诉大家,如果本文对您有所帮助,点赞+关注
鼓励一下呗~
相关文章
- 一起来学设计模式之认识设计模式
- 一起来学设计模式之单例模式
- 一起来学设计模式之工厂模式
- 一起来学设计模式之建造者模式
- 一起来学设计模式之原型模式
- 一起来学设计模式之适配器模式
- 一起来学设计模式之桥接模式
- 一起来学设计模式之组合模式
- 一起来学设计模式之装饰器模式
- 一起来学设计模式之外观模式
- 一起来学设计模式之享元模式
- 一起来学设计模式之代理模式
- 一起来学设计模式之责任链模式
- 一起来学设计模式之命令模式
- 一起来学设计模式之解释器模式
- 一起来学设计模式之迭代器模式
- 一起来学设计模式之中介者模式
- 一起来学设计模式之备忘录模式
- 一起来学设计模式之观察者模式
- 一起来学设计模式之状态模式
- 一起来学设计模式之策略模式
项目源码(源码已更新 欢迎star⭐️)
Kafka 专题学习
- 一起来学kafka之Kafka集群搭建
- 一起来学kafka之整合SpringBoot基本使用
- 一起来学kafka之整合SpringBoot深入使用(一)
- 一起来学kafka之整合SpringBoot深入使用(二)
- 一起来学kafka之整合SpringBoot深入使用(三)
项目源码(源码已更新 欢迎star⭐️)
ElasticSearch 专题学习
- 利用docker搭建es集群
- 一起来学ElasticSearch(一)
- 一起来学ElasticSearch(二)
- 一起来学ElasticSearch(三)
- 一起来学ElasticSearch(四)
- 一起来学ElasticSearch(五)
- 一起来学ElasticSearch(六)
- 一起来学ElasticSearch(七)
- 一起来学ElasticSearch(八)
- 一起来学ElasticSearch(九)
- 一起来学ElasticSearch(十)
- 一起来学ElasticSearch之整合SpringBoot(一)
- 一起来学ElasticSearch之整合SpringBoot(二)
- 一起来学ElasticSearch之整合SpringBoot(三)
项目源码(源码已更新 欢迎star⭐️)
往期并发编程内容推荐
- Java多线程专题之线程与进程概述
- Java多线程专题之线程类和接口入门
- Java多线程专题之进阶学习Thread(含源码分析)
- Java多线程专题之Callable、Future与FutureTask(含源码分析)
- 面试官: 有了解过线程组和线程优先级吗
- 面试官: 说一下线程的生命周期过程
- 面试官: 说一下线程间的通信
- 面试官: 说一下Java的共享内存模型
- 面试官: 有了解过指令重排吗,什么是happens-before
- 面试官: 有了解过volatile关键字吗 说说看
- 面试官: 有了解过Synchronized吗 说说看
- Java多线程专题之Lock锁的使用
- 面试官: 有了解过ReentrantLock的底层实现吗?说说看
- 面试官: 有了解过CAS和原子操作吗?说说看
- Java多线程专题之线程池的基本使用
- 面试官: 有了解过线程池的工作原理吗?说说看
- 面试官: 线程池是如何做到线程复用的?有了解过吗,说说看
- 面试官: 阻塞队列有了解过吗?说说看
- 面试官: 阻塞队列的底层实现有了解过吗? 说说看
- 面试官: 同步容器和并发容器有用过吗? 说说看
- 面试官: CopyOnWrite容器有了解过吗? 说说看
- 面试官: Semaphore在项目中有使用过吗?说说看(源码剖析)
- 面试官: Exchanger在项目中有使用过吗?说说看(源码剖析)
- 面试官: CountDownLatch有了解过吗?说说看(源码剖析)
- 面试官: CyclicBarrier有了解过吗?说说看(源码剖析)
- 面试官: Phaser有了解过吗?说说看
- 面试官: Fork/Join 有了解过吗?说说看(含源码分析)
- 面试官: Stream并行流有了解过吗?说说看
推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)
- springboot-all
地址
: github.com/qiuChenglei…- SpringBoot系列教程合集
- 一起来学SpringCloud合集
- SpringCloud整合 Oauth2+Gateway+Jwt+Nacos 实现授权码模式的服务认证(一)
- SpringCloud整合 Oauth2+Gateway+Jwt+Nacos 实现授权码模式的服务认证(二)