Java设计模式之 模板语法设计模式
一、简介和使用场景
当我们想要定义一个框架模板,大体流程确定下来,但是具体流程内容不确定,这时可以使用 模板语法设计模式。不仅可以共用公共的代码,提到代码复用性;还可以约束整个子类的大体行为,确定框架模板。
比如我们一张电子试卷,选择题–》填空题–》简单题–》大题–》压轴题,整个试卷的框架定义下来,但是试卷中每个类型的题目是随机的。我们可以用模板语法来定义,先定义整个流程框架,然后再让子类重写每个流程节点的。
二、具体实现
// 父类
public abstract class TemplateMethodsModel {
// 1.提供模板方法。
// final 是为避免子类去修改模板。
public final String write(){
String header = "\n\t《我的好爸爸》";
// 3.调用抽象方法。
// 抽象方法会被子类重写,从而实现子类多态,不同的子类可以实现不同的方法
String content = writeContent();
String footer = "\n这就是我的好爸爸,我非常爱他。";
return header + content + footer;
}
// 2.提供抽象方法供子类重写。
// abstract 抽象方法是为了让强制子类重写,从而实现多态。
public abstract String writeContent();
}
//子类son
class Son extends TemplateMethodsModel{
// 4.子类重写抽象方法
@Override
public String writeContent() {
return "\n我的父亲非常严格,每当我犯了错误的时候,便会揍我。" +
"父亲就像修剪一个小树,修剪我的枝枝丫丫,伴我长成参天大树。";
}
}
// 子类daughter
class Daughter extends TemplateMethodsModel{
// 4.子类重写抽象方法
@Override
public String writeContent() {
return "\n我的爸爸非常温柔,每当我犯错的时候,常常安慰我。" +
"父亲就像一棵参天大树,为我遮挡风雨。";
}
}
//测试类
class test3 {
public static void main(String[] args) {
TemplateMethodsModel son = new Son();
System.out.println(son.write());
TemplateMethodsModel daughter = new Daughter();
System.out.println(daughter.write());
/*结果:
《我的好爸爸》
我的父亲非常严格,每当我犯了错误的时候,便会揍我。父亲就像修剪一个小树,修剪我的枝枝丫丫,伴我长成参天大树。
这就是我的好爸爸,我非常爱他。
《我的好爸爸》
我的爸爸非常温柔,每当我犯错的时候,常常安慰我。父亲就像一棵参天大树,为我遮挡风雨。
这就是我的好爸爸,我非常爱他。
*/
}
}
三、总结
-
步骤:
- 首先在父类中定义模板框架方法,
- 然后再在父类中定义流程子节点抽象方法,
- 再然后父类框架中调用这些抽象方法。
- 最后,由子类继承父类并且重写抽象方法。
-
执行流程:
- 首先实例对象调用父类的write()方法。(该方法 finnal,子类不能重写,这样只能调用父类的该方法)
- 其次执行 write() 方法时,会调用抽象方法,由于多态原因,调用的抽象方法会优先执行子类的重写的方法 writeContent()