定义:
在一个方法中定义一个算法的骨架,将一些步骤延迟到子类中实现
好处:
代码复用, 对于某些算法的实现时,很有效,确定了整体的架子,让子类去实现具体的步骤
应用实例:
造房子的时候,步骤:地基、走线、水管都一样
连接数据库,步骤: 加载驱动 、 获取连接对象、执行SQL、处理结果 、关闭对象
。。。等
代码背景:
-
打LOL游戏的步骤是:
-
PC登录
-
初始化游戏
-
开始匹配
-
游戏结束
-
-
打王者荣耀游戏的步骤:
-
手机登录
-
初始化游戏
-
开始匹配
-
游戏结束
-
比较发现 2、3、4步骤是很相似的,1步骤不同(王者有PC端,LOL也有了手游,以上举例),所以我们可以提取中抽象类。
定义模板步骤
/** * @Author: MMDZ * @Date: 2021/10/22 * @Desc: TODO 游戏模板 */ public abstract class Game { protected abstract void into(); protected void initialize(){ System.out.println("初始化"); }; protected void startPlay(){ System.out.println("开始匹配"); }; protected void endPlay(){ System.out.println("游戏结束"); }; //模板 public final void play(){ //登入 into(); //初始化游戏 initialize(); //开始游戏 startPlay(); //结束游戏 endPlay(); } }
定义游戏
/** * @Author: CN802195 * @Date: 2021/10/22 * @Desc: TODO LOL游戏 */ public class Lol extends Game { @Override protected void into() { System.out.println("LOL英雄联盟 PC登录 登录"); } }
/** * @Author: MMDZ * @Date: 2021/10/22 * @Desc: TODO 王者荣耀游戏 */ public class Wzry extends Game { @Override protected void into() { System.out.println("王者荣耀 手机登录"); } }
测试
public class TemplatePatternDemo { public static void main(String[] args) { // write your code here Game game = new Lol(); game.play(); System.out.println(); game = new Wzry(); game.play(); } } /* 控制台显示 LOL英雄联盟 PC登录 登录 初始化 开始匹配 游戏结束 王者荣耀 手机登录 初始化 开始匹配 游戏结束 */
总结
1)具体细节步骤实现定义在子类中,子类定义详细处理算法是不会改变算法整体结构。