模板模式(Template Pattern)
一个抽象类(模板)定义了类中方法的执行方式,子类对模板中的方法进行具体实现,调用的时候以抽象类中的方式进行调用。
目的:定义一个类中方法的骨架,将特定实现延续到子类中。
主要解决:一些方法通用,却在每一个子类中都重写了这个方法。
何时使用:一些通用的方法。
如何解决:将这些通用算法抽象在模板中。
关键代码:在抽象类中实现,其他步骤在子类中实现。
使用场景:多个子类有共同的方法,且逻辑相同;重复复杂的方法。
优点:封装不需要改变的部分,扩展可以改变的部分;提取公共代码,便于维护;行为由父类控制,(具体)类容由子类实现。
缺点:每一个不同的子类实现都需要写一个模板的子类,子类个数增加,系统庞大。
注意事项:防止恶意操作,模板方法一般都加final关键字。
创建抽象类(模板)
1 /** 2 * @author: wooch 3 * @create: 2020/02/14 4 */ 5 public abstract class Game { 6 abstract void initialize(); 7 abstract void startPlay(); 8 abstract void endPlay(); 9 // 模板 10 public final void play(){ 11 // 初始化 12 initialize(); 13 // 开始 14 startPlay(); 15 // 结束 16 endPlay(); 17 } 18 }
创建子类(Cricket)
1 /** 2 * @author: wooch 3 * @create: 2020/02/14 4 */ 5 public class Cricket extends Game { 6 @Override 7 void initialize() { 8 System.out.println("Cricket Game Initialized!"); 9 } 10 11 @Override 12 void startPlay() { 13 System.out.println("Cricket Game Started."); 14 } 15 16 @Override 17 void endPlay() { 18 System.out.println("Cricket Game Finished."); 19 } 20 }
创建子类(Football)
1 /** 2 * @author: wooch 3 * @create: 2020/02/14 4 */ 5 public class Football extends Game { 6 @Override 7 void initialize() { 8 System.out.println("Football Game Initialized!"); 9 } 10 11 @Override 12 void startPlay() { 13 System.out.println("Football Game Started."); 14 } 15 16 @Override 17 void endPlay() { 18 System.out.println("Football Game Finished."); 19 } 20 }
演示结果
1 /** 2 * @author: wooch 3 * @create: 2020/02/14 4 */ 5 public class TemplatePatternTest { 6 public static void main(String[] args) { 7 Game game = new Cricket(); 8 game.play(); 9 System.out.println(); 10 game = new Football(); 11 game.play(); 12 } 13 }
运行结果
1 Cricket Game Initialized! 2 Cricket Game Started. 3 Cricket Game Finished. 4 5 Football Game Initialized! 6 Football Game Started. 7 Football Game Finished.