Template 模式
Template 字面上的含义就是模板的意思,比如朋友们喜欢的神秘花园。
只要用不同颜色的笔就能涂出美丽的效果,如果我们用纯色的笔来涂,那么它就是纯色的;如果我们用彩色的笔来涂,那么它就是五颜六色的。但是无论我们用什么笔来涂,它都是模板给的样子,就像上边那只孔雀,不管是什么颜色的孔雀,都是一只孔雀。
简单来说,Template 模式就是在父类中定义处理流程框架,在子类中实现具体处理的模式。我们用一个简单的栗子来说明。我们现在要打印字符或者字符串如果是字符的话就让它循环打印10遍(不换行)并在前后加上“”,例如如果是字符串的话,就让它循环打印10遍(换行)并在首尾行加上与字符串等长的“+”,例如
+++++++++++
Hello,world
Hello,world
Hello,world
...
Hello,world
+++++++++++DisplayTemplate首先我们定义一个模板,也就是一个抽象类 DisplayTemplate,这里面有一系列抽象方法:、、,和一个模板方法负责把这一系列抽象方法组成一个工作模板。
/**
* 抽象类 DisplayTemplate
*/
publicabstractclassDisplayTemplate{
publicabstractvoidprint();
publicabstractvoidbegin();
publicabstractvoidend();
// 调用抽象方法组成模板
publicfinalvoiddisplay() {
begin();
for(inti=;i
print();
}
end();
}
}DisplayChar然后我们来实现模板中定义的抽象方法,展示一个字符。
/**
* 实现模板中的抽象方法,展示字符
*/
publicclassDisplayCharextendsDisplayTemplate{
privatecharch;
publicDisplayChar(charch) {
this.ch=ch;
}
@Override
publicvoidprint() {
System.out.print(ch);
}
@Override
publicvoidbegin() {
System.out.print("
}
@Override
publicvoidend() {
System.out.println(">");
}
}DisplayString接着实现展示字符串。
/**
* 具体实现模板中的抽象方法,展示字符串
*/
publicclassDisplayStringextendsDisplayTemplate{
privateStringstr;
publicDisplayString(Stringstr) {
this.str=str;
}
privatevoidprintLine() {
for(inti=;i
System.out.print("+");
}
System.out.println();
}
@Override
publicvoidprint() {
System.out.println(str);
}
@Override
publicvoidbegin() {
printLine();
}
@Override
publicvoidend() {
printLine();
}
}至此,我们就实现了不同方式展示字符和字符串,但又同样遵循同一种展示框架。代码地址:https://github.com/MrNullPoint/TemplateExp
解惑
逻辑处理通用化很多时候,我们的业务逻辑是可以抽象出来的,如果我们在父类中定义好了程序逻辑或者实现完了算法,在子类中就不用考虑程序逻辑和算法一类的问题,如果逻辑或者算法出现了 Bug,我们只需要找到父类修改模板方法即可。
领取专属 10元无门槛券
私享最新 技术干货