模板模式(Template Pattern)
1.策略模式(Strategy Pattern)2.桥接模式(Bridge Pattern)3.代理模式(Proxy Pattern)4.中介者模式(Mediator Pattern)5.过滤器模式(Filter Pattern)6.适配器模式(Adapter Pattern)7.责任链模式(Chain Of Responsibility Pattern)8.装饰器模式(Decorator Pattern)9.建造者模式(Builder Pattern)10.观察者模式(Observer Pattern)11.工厂模式(Factory Pattern)12.单例模式(Singleton Pattern)13.组合模式(Composite Pattern)
14.模板模式(Template Pattern)
15.原型模式(Prototype Pattern)16.外观模式(Facade Pattern)17.享元模式(Flyweight Pattern)18.命令模式(Command Pattern)19.解释器模式(Interpreter Pattern)20.迭代器模式(Iterator Pattern)模板模式
一、介绍
模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
- 意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
- 主要解决:一些方法通用,却在每一个子类都重新写了这一方法。
- 何时使用:有一些通用的方法。
- 如何解决:将这些通用算法抽象出来。
- 关键代码:在抽象类实现,其他步骤在子类实现。
二、优缺点
2.1 优点
- 封装不变部分,扩展可变部分。
- 提取公共代码,便于维护。
- 行为由父类控制,子类实现。
2.2 缺点
- 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
三、使用场景
- 有多个子类共有的方法,且逻辑相同。
- 重要的、复杂的方法,可以考虑作为模板方法。
注意事项:为防止恶意操作,一般模板方法都要加上final关键词。
四、具体实现

1、创建一个抽象类,它的模板方法被设置为 final。
/**
* 模板设计模式 game抽象类
*
* @author zt1994 2021/4/3 15:41
*/
public abstract class AbstractGame {
/**
* 初始化游戏
*/
abstract void initialize();
/**
* 开始游戏
*/
abstract void startPlay();
/**
* 结束游戏
*/
abstract void endPlay();
/**
* 模板 final实现
*/
public final void play() {
initialize();
startPlay();
endPlay();
}
}
2、创建扩展了上述类的实体类。
/**
* Cricket实体类
*
* @author zt1994 2021/4/3 15:42
*/
public class Cricket extends AbstractGame {
@Override
void initialize() {
System.out.println("Cricket Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Cricket Game Started. Enjoy the game!");
}
@Override
void endPlay() {
System.out.println("Cricket Game Finished!");
}
}
/**
* Football实体类
*
* @author zt1994 2021/4/3 15:43
*/
public class Football extends AbstractGame {
@Override
void initialize() {
System.out.println("Football Game Initialized! Start playing.");
}
@Override
void startPlay() {
System.out.println("Football Game Started. Enjoy the game!");
}
@Override
void endPlay() {
System.out.println("Football Game Finished!");
}
}
3、使用 Game 的模板方法 play() 来演示游戏的定义方式。
/**
* 模板模式测试类
*
* @author zt1994 2021/4/3 15:44
*/
public class TemplatePatternTest {
public static void main(String[] args) {
AbstractGame game = new Cricket();
game.play();
System.out.println("------");
game = new Football();
game.play();
}
}
4、测试结果
Cricket Game Initialized! Start playing.
Cricket Game Started. Enjoy the game!
Cricket Game Finished!
------
Football Game Initialized! Start playing.
Football Game Started. Enjoy the game!
Football Game Finished!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律