1、模板模式简介
定义:一种类行为型模式,定义一个操作中的骨架,而将实现步骤的延迟到子类中,使得子类可以不改变该骨架结构的情况下重定义某些特定步骤
目标:不改变步骤实现不同的结果
解决问题:解决因为小部分差异而导致的代码冗余
优点:封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展,在父类中提取了公共的部分代码,便于代码复用
部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。
缺点:对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象,间接地增加了系统实现的复杂度
父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度
由于继承关系自身的缺点,如果父类添加新的抽象方法,则所有子类都要改一遍
实现:
1 /**抽象类**/ 2 public abstract class fatherClass { 3 /**抽象类**/ 4 public void TemplateMethod(){ 5 //抽象方法 6 Template1(); 7 Template2(); 8 Template3(); 9 } 10 /**具体方法**/ 11 public void Template1(){ 12 System.out.println("模板方法壹号"); 13 } 14 /**抽象方法1**/ 15 public abstract void Template2(); 16 /**抽象方法2**/ 17 public abstract void Template3(); 18 } 19 20 /**具体子类1**/ 21 public class son1Class extends fatherClass { 22 @Override 23 public void Template2() { 24 System.out.println("son1 抽象方法壹号"); 25 } 26 27 @Override 28 public void Template3() { 29 System.out.println("son1 抽象方法贰号"); 30 } 31 } 32 33 /**具体子类2**/ 34 public class son2Class extends fatherClass { 35 @Override 36 public void Template2() { 37 System.out.println("son2 抽象方法壹号"); 38 } 39 40 @Override 41 public void Template3() { 42 System.out.println("son2 抽象方法贰号"); 43 } 44 } 45 46 /**测试方法**/ 47 public class test { 48 public static void main(String[] args) { 49 fatherClass fatherClass = new son1Class(); 50 fatherClass.TemplateMethod(); 51 System.out.println("========================================"); 52 fatherClass fatherClass1 = new son2Class(); 53 fatherClass1.TemplateMethod(); 54 } 55 } 56 57 测试结果: 58 模板方法壹号 59 son1 抽象方法壹号 60 son1 抽象方法贰号 61 ======================================== 62 模板方法壹号 63 son2 抽象方法壹号 64 son2 抽象方法贰号