🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~
津津乐道设计模式 - 模版模式详解
- 什么是模版模式
- 模版模式的应用场景
- 生活案例
- 案例代码
- 结语
什么是模版模式
模板模式(Template Pattern)是一种行为设计模式,它定义了一个算法的骨架,将一些步骤的实现延迟到子类中。模板模式使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤
模版模式的应用场景
-
算法的骨架固定
:当一个算法的骨架固定不变,但是其中某些步骤的具体实现可能会有所不同,可以使用模板模式。模板模式定义了算法的骨架,而具体的步骤可以由子类来实现,从而实现算法的定制化。 -
避免代码重复
:如果有多个类拥有相似的行为,但其中某些步骤的实现可能有差异,可以使用模板模式来避免代码的重复。将相同的步骤放在模板类中,而将不同的实现放在具体的子类中,可以减少重复的代码,提高代码的复用性。 -
需要在不破坏封装的情况下扩展算法
:模板模式可以在不破坏原有算法封装的情况下,通过子类重写特定的步骤来扩展算法的功能。这样可以保持算法的稳定性,并且使得扩展变得更加灵活和可控。 -
控制算法的执行流程
:通过模板模式,可以在算法中定义执行的顺序和条件,确保每个步骤都按照特定的顺序执行,并且可以通过在模板方法中加入钩子方法来控制算法的执行流程。
比如我们开发中常见的:
框架和库的设计:很多框架和库使用模板模式来定义一些核心的算法或流程,然后允许开发者根据需要进行定制。
数据库访问:在数据库访问过程中,可以使用模板模式来定义一些通用的操作流程,比如连接数据库、执行查询、关闭连接等,而具体的SQL语句可以由子类来实现。
生活案例
细心的你或许发现了,你的女朋友每次化妆前都有她固有的一套流程:比如清洁、涂抹粉底、眼妆、腮红、口红
等。每个化妆步骤的顺序是固定的,但是具体的产品和每一种妆容化妆技巧可能有所不同。
在这种情况下,你女朋友就是使用模板模式来帮助她更方便地完成化妆过程 😂 。
案例代码
上面女朋友化妆案例中,我们使用JAVA代码来给大家演示一下
首先,创建一个抽象类 MakeupTemplate,它定义了化妆的步骤:
/**
* 化妆抽象类 定义了化妆的步骤
*/
public abstract class MakeupTemplate {
public final void doMakeup() {
washFace();
applyFoundation();
doEyeMakeup();
doBlushMakeup();
applyLipstick();
}
//洁面
protected abstract void washFace();
//涂抹粉底
protected abstract void applyFoundation();
//眼妆
protected abstract void doEyeMakeup();
//腮红
protected abstract void doBlushMakeup();
//口红
protected abstract void applyLipstick();
}
然后,创建具体的化妆类,继承 MakeupTemplate 并实现特定的步骤:
自然淡雅妆
/**
* 定义自然妆
*/
public class NaturalMakeup extends MakeupTemplate {
@Override
protected void washFace() {
System.out.println("美白洗面奶清洁脸部");
}
@Override
protected void applyFoundation() {
System.out.println("涂抹轻薄的粉底");
}
@Override
protected void doEyeMakeup() {
System.out.println("涂抹淡雅的眼影和睫毛膏");
}
@Override
protected void doBlushMakeup() {
System.out.println("拍上淡粉的腮红");
}
@Override
protected void applyLipstick() {
System.out.println("涂抹自然色调的口红");
}
}
魅力妖艳妆
/**
* 定义魅力妖艳妆
*/
public class GlamorousMakeup extends MakeupTemplate {
@Override
protected void washFace() {
System.out.println("补水洗面奶清洁脸部");
}
@Override
protected void applyFoundation() {
System.out.println("涂抹厚厚的粉底");
}
@Override
protected void doEyeMakeup() {
System.out.println("涂抹浓密的眼影和眼线");
}
@Override
protected void doBlushMakeup() {
System.out.println("拍上艳丽的腮红");
}
@Override
protected void applyLipstick() {
System.out.println("涂抹鲜艳的口红");
}
}
在测试代码中,你可以根据女朋友的需求选择不同的化妆风格,而无需关心具体的步骤:
public class TemplatePatternTest {
public static void main(String[] args) {
MakeupTemplate naturalMakeup = new NaturalMakeup();
System.out.println("女友开始画自然妆:");
naturalMakeup.doMakeup();
System.out.println("------------------------");
System.out.println("女友开始画魅力妖艳妆:");
MakeupTemplate glamorousMakeup = new GlamorousMakeup();
glamorousMakeup.doMakeup();
}
}
最后输出结果如下
你的女朋友通过模板模式可以根据不同的场合选择适合的化妆风格,而不需要关心每个步骤的具体实现。这样可以简化化妆的过程,并且保证每个步骤的顺序正确。
结语
本章内容带大家以实际生活场景 - 女友化妆流程;带大家深刻认识模板模式的使用方法。
总结就是模板模式在需要定义算法的骨架并允许具体步骤定制化的场景下非常有用。它提供了一种有效的方式来实现代码复用、增强扩展性,并能控制算法的执行流程。
样例代码:https://github.com/lhmyy521125/toher-designmode