模板方法模式
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
优点:
1、封装不变部分,扩展可变部分。
2、提取公共代码,便于维护。
3、行为由父类控制,子类实现。
缺点:
每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
使用场景:
1、有多个子类共有的方法,且逻辑相同。
2、重要的、复杂的方法,可以考虑作为模板方法
具体实现
抽象算法类
package com.chenpt.designModel.templateModel; /** * @Author: chen * @Description: * @Date: created in 2018/8/28 * @Modified By: */ public abstract class Game { abstract void initGame(); abstract void startGame(); abstract void endGame(); public void play(){ initGame();//初始化游戏 startGame();//开始游戏 endGame();//游戏结束 } }
子类一
package com.chenpt.designModel.templateModel; /** * @Author: chen * @Description: * @Date: created in 2018/8/28 * @Modified By: */ public class BasketballGame extends Game { @Override void initGame() { System.out.println("篮球运动准备中···"); } @Override void startGame() { System.out.println("开始比赛···"); } @Override void endGame() { System.out.println("比赛结束"); } }
子类二
package com.chenpt.designModel.templateModel; /** * @Author: chen * @Description: * @Date: created in 2018/8/28 * @Modified By: */ public class FootballGame extends Game { @Override void initGame() { System.out.println("足球运动准备中···"); } @Override void startGame() { System.out.println("开始比赛···"); } @Override void endGame() { System.out.println("比赛结束"); } }
客户端
package com.chenpt.designModel.templateModel; /** * @Author: chen * @Description: * @Date: created in 2018/8/28 * @Modified By: */ public class MainTest { public static void main(String[] args){ Game bgame = new BasketballGame(); bgame.play(); System.out.println("=============无敌分割线==============="); Game fgame = new FootballGame(); fgame.play(); } } //执行结果 篮球运动准备中··· 开始比赛··· 比赛结束 =============无敌分割线=============== 足球运动准备中··· 开始比赛··· 比赛结束