优点
封装不变部分,扩展可变部分。
提取公共代码,便于维护。
行为由父类控制,子类实现。
缺点
每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
使用场景
1.有多个子类共有的方法,且逻辑相同。
2.重要的、复杂的方法,可以考虑作为模板方法。
一、实现方式
假设一个场景,我们在玩游戏的时候,都需要初始化加载游戏,然后开始游戏,最后结束游戏,这像是一套模板一样的操作,但是具体的实现方法却不同,例如:LOL 游戏与 CF 游戏的加载资源肯定不同,游戏的内容也不同。
1、游戏抽象类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package com.asurplus测试数据mon.template; /** * 游戏抽象类 */ public abstract class Game { // 初始化游戏 abstract void init(); // 开始游戏 abstract void start(); // 结束游戏 abstract void end(); // 模板 public final void play() { // 初始化游戏 init(); // 开始游戏 start(); // 结束游戏 end(); } } |
2、LOL游戏类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package com.asurplus测试数据mon.template; import lombok.extern.slf4j.Slf4j; /** * LOL游戏 */ @Slf4j public class LolGame extends Game { @Override void init() { log.info( "初始化 LOL 游戏" ); } @Override void start() { log.info( "LOL 游戏开始" ); } @Override void end() { log.info( "LOL 游戏结束" ); } } |
3、CF游戏类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package com.asurplus测试数据mon.template; import lombok.extern.slf4j.Slf4j; /** * CF游戏 */ @Slf4j public class CfGame extends Game { @Override void init() { log.info( "初始化 CF 游戏" ); } @Override void start() { log.info( "CF 游戏开始" ); } @Override void end() { log.info( "CF 游戏结束" ); } } |
二、测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
package com.asurplus测试数据mon.template;
/** * 模板模式 */ public class TestMain { public static void main(String[] args) { // LOL 游戏 Game lolGame = new LolGame(); lolGame.play(); System.out.println(); // CF 游戏 Game cfGame = new CfGame(); cfGame.play(); } } |
输出结果
可以看出,一套模板,可以有多个实现方式,从而实现了我们的工厂模式。
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!
原文链接:https://blog.csdn.net/qq_40065776/article/details/123150650
查看更多关于Java中常用的设计模式之模板模式详解的详细内容...