模板模式是一种非常好的,万金油的设计模式。此设计模式在我的项目中也多有体现。故写出来总结一下。
首先介绍一下模板模式。模板模式即是在基类定义一个算法框架,将一些步骤延迟在子类中实现。使得子类不用改变算法结构,就可以重写算法步骤的细节。 模板模式 最基本的结构包括,一个定义了主逻辑方法的接口。一个实现了接口的主逻辑方法和逻辑中各个步骤的protected方法的基类。以及若干个继承自主逻辑方法并根据自身业务的差异性,重写了基类的protected步骤方法的子类。
下面写一个盖房子的代码例子参考。
1 //盖房子接口 2 public interface IBuildHouse{ 3 //建造(主逻辑方法) 4 void build(); 5 6 } 7 8 //盖房子基类 9 public class BaseBuildHouse implement IBuildHouse{ 10 //建造(主逻辑方法) 11 @override 12 public void build(){ 13 //打地基 14 this.groundFoundation(); 15 //造墙 16 this.buildWall(); 17 //造屋顶 18 this.buildRoof(); 19 } 20 21 //打地基 22 protected void groundFoundation(){"打地基"} 23 24 //造墙 25 protected void buildWall(){} 26 27 //造屋顶 28 protected void buildRoof(){} 29 } 30 31 //盖水泥房 32 public class BuildCementHouse extends BaseBuildHouse { 33 //重写造墙 34 @override 35 protected void buildWall(){"造水泥墙"} 36 37 //重写造屋顶 38 @override 39 protected void buildRoof(){"造水泥屋顶"} 40 } 41 42 //盖木房 43 public class BuildWoodHouse extends BaseBuildHouse { 44 //重写造墙 45 @override 46 protected void buildWall(){"造木墙"} 47 48 //重写造屋顶 49 @override 50 protected void buildRoof(){"造木屋顶"} 51 } 52 53 //调用的代码 54 //建水泥房 55 new BuildCementHouse().build(); 56 //建木房 57 new BuildWoodHouse().build(); 58 59 60 61 62 63 64
由以上例子可知。基类定义了盖房子的主方法,和各个步骤的方法。如果要盖水泥房,就重写盖屋顶和盖墙的步骤方法。而打地基是不用重写的,因为水泥房和木房打地基的方式都一样(假设)。
结合以上例子, 就可以更好理解 “ 基类定义一个算法框架,将一些步骤延迟在子类中实现。使得子类不用改变算法结构,就可以重写算法步骤的细节” 这句话了。