
设计模式-04.模板方法模式
抽象类定义一个操作的基本架构,如一个方法 子类继承抽象类,并重写其中某些步骤或方法,通常只需要修改特定的操作逻辑。 在运行时,模板方法的步骤按照抽象类定义的顺序被执行,子类的实现被适时调用。
发布日期:2021-05-20 05:12:28
浏览次数:12
分类:精选文章
本文共 2389 字,大约阅读时间需要 7 分钟。
模板方法模式(Template Method Pattern)
模板方法模式是一种行为型设计模式,其核心思想是将一个操作的算法定义为一个抽象类中的模板,子类可以按需重写部分实现,但执行顺序和共享的部分由抽象类控制。这种设计模式尤其适用于处理多个子类共享一套算法的情况,允许子类灵活扩展和修改。
模板方法模式的定义
在模板方法模式中:
- 抽象类声明一个操作的步骤模板,通常通过一个
final
方法实现。 - 子类可以选择重写模板方法的某个步骤或是实现多个步骤。
- 模板方法的执行顺序由抽象类控制,而可变部分由子类实现。
这种模式的具体过程包括:
play
,它包含一些步骤,这些步骤由其他方法实现。优点
- 封装不变部分:共享的算法被封装在抽象类中,避免重复代码。
- 易于维护:一旦抽象类中的某个共享步骤需要修改,所有子类都获益。
- 遵循开闭原则:子类可以扩展行为,但父类的行为是不变的。
缺点
- 类的复杂性:随着子类数量增加,项目的类结构变得庞大。
- 代码阅读难度:父类的行为对子类会有影响,增加了对新手的困扰。
使用场景
- 共享算法:多个子类共享一套算法,但每个子类只需修改部分步骤。
- 重要或复杂的算法:将其核心逻辑设计为模板方法,确保所有子类遵循统一的逻辑流程。
- 代码重构:将现有代码抽象出来,减少代码冗余,提高可维护性。
实现示例
假设有 Game
抽象类,其子类 Cricket
和 Football
各自继承自 Game
:
Game.java
public abstract class Game { public final void play() { initialize(); // 初始化游戏 startPlay(); // 开始游戏 endPlay(); // 结束游戏 } // 每一个具体的子类需要实现的方法 abstract void initialize(); abstract void startPlay(); abstract void endPlay();}
Cricket.java
public class Cricket extends Game { @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.java
public class Football extends Game { @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!"); }}
TemplatePatternDemo.java
public class TemplatePatternDemo { public static void main(String[] args) { Game game = new Cricket(); game.play(); System.out.println(); game = new Football(); game.play(); }}
解释与输出
- 输出结果:
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!
这一示例展示了如何使用模板方法模式来实现两个不同的子类(Cricket 和 Football),每个子类按照自己的方式为 Game
抽象类的方法提供实现,而 play()
方法则是一致的,调用了所有步骤。
总结
模板方法模式通过将通用算法封装到抽象类中,允许子类按需扩展或重写个别步骤,从而实现了共享算法和灵活扩展的双重目标。这种模式尤其适用于需要多种行为并保持一致性操作的情况,用其优点和缺点综合考虑后,可以选择在代码中适当使用,提升系统的扩展性和可维护性。
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年05月02日 17时40分46秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PyCharm配置anaconda环境
2019-03-15
SpringBoot与缓存(JSR-107、Spring缓存抽象)
2019-03-15
ERROR 总结
2019-03-15
查找最小值栈的O(1)
2019-03-15
淘宝天猫双十一养猫组队怎么踢人
2019-03-15
Java面试题整理,闭关在家37天“吃透”这份345页PDF,纯干货
2019-03-15
概念唱片Plastic Beach封面高清壁纸
2019-03-15
旅游后期效果Ography Lightroom预设
2019-03-15
2017CS231n笔记5.CNN
2019-03-15
vue项目报错集合
2019-03-15
图片链接
2019-03-15
LINUX-WIFI无线接入的一些东西
2019-03-15
word文档手写字母总会大写问题
2019-03-15
Redis中的key
2019-03-15
juc-09-控制并发流程工具类
2019-03-15
第一节 docker安装
2019-03-15
Linux系统时间与硬件时间及时间同步
2019-03-15
Spring 和 DI 依赖注入
2019-03-15
中序线索二叉树的遍历
2019-03-15