模板方法模式 Template method 行为型 设计模式(二十六)
模板方法模式 Template method
上图为网上百度的一份简历模板截图
相信大家都有求职的经历,那么必然需要简历,写简历的时候,很可能你会网上检索一份简历模板,使用此模板的格式,然后替换为你的内容。
我们从小就有语文课,逢考必有作文,而学习的途径之一就是参考优秀的范文,学习了解他们的结构,风格等。
以上就是现实世界中的模板,模板的概念随处可见,所有的工业制品哪个不是模具生产的?
在程序设计中,也有模板的概念
在软件开发过程中,可能经常会用到类似的处理逻辑,但是可能又有一些细节的差异
比如做菜,不管做什么菜,基本上都离不开买菜,洗菜,切菜,做菜几个主要步骤
这几个步骤中,只有做菜的差别最大,不同的菜不同的做法,而买菜洗菜切菜的过程,却基本类似
我们常常希望能够定义一个通用的处理框架,然后将一部分实现细节交由子类进行处理
也就是面向框架进行编程,而不是每次都复制粘贴修改代码,具体的细节依靠子类确定,这就是模板的初衷。
比如定义一个做菜的抽象类,实现了买菜,洗菜,切菜,做菜方法定义为抽象方法留待子类实现
那么,回锅肉和大头菜就可以通过继承扩展做菜类,只需要实现做菜的环节即可。
意图
定义一个操作中的算法的骨架,而将一些步骤延时到子类中。 TemplateMethod使得子类可以不改变一个算法的结构即可重新定义算法的某些特定步骤。结构
抽象模板角色AbstractClass 定义一个或者多个抽象步骤,这些抽象操作叫做基本操作 他们可能是一个复杂操作的组成步骤 实现类角色ConcreteClass 实现父类所定义的一个或者多个抽象方法 每一个抽象模板都可以有任意多个具体的模板角色与之对应,而实际中,一般不止一个代码示例
定义做菜步骤:买菜,洗菜,切菜,做菜。 买菜、洗菜、切菜都一样,做菜不同菜不同做法 上菜将他们步骤进行打包package template; public abstract class 做菜 { public void 买菜(){ System.out.println("买菜..."); } public void 洗菜(){ System.out.println("洗菜..."); } public void 切菜(){ System.out.println("切菜..."); } public abstract void 做菜(); public void 上菜(){ 买菜(); 洗菜(); 切菜(); 做菜(); System.out.println("客官,菜来了~~~"); } }做回锅肉和做大头菜都重写了“做菜”的方法
package template; public class 做回锅肉 extends 做菜 { @Override public void 做菜() { System.out.println("做回锅肉..."); } }
package template; public class 做大头菜 extends 做菜 { @Override public void 做菜() { System.out.println("做大头菜..."); } }
测试代码