模板模式:在父类中封装算法,但是在子类中实现其具体细节。
直接上实例:
package quan.qin.study.designpattern.template;
public abstract class TemplatePattern {
public void cooking() {
putOil();
lightFire();
putVegetable();
addSpecies();
if (isSweetPrefered()) {
addSugar();
}
turnOffFire();
}
private final void putOil() {
System.out.println("倒油");
}
private final void lightFire() {
System.out.println("生火");
}
private final void putVegetable() {
System.out.println("放菜");
}
abstract public void addSpecies();
public abstract boolean isSweetPrefered() ;
private final void turnOffFire() {
System.out.println("关火");
}
private void addSugar() {
System.out.println("加糖");
}
}
在这个class中,我们有定义两个抽象方法:
addSpecies() 和 isSweetPrefered() 可由子类来实现其具体细节。
我们在父类中只需要封装好cooking()方法中的算法。
然后在子类中,我们只需要实现addSpecies() 和 isSweetPrefered()这两个行为即可。另外,在isSweetPrefered()由用户的输入行为来确定到底是返回true还是false。
下面是一个子类的实现:
package quan.qin.study.designpattern.template;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class TemplateImpl extends TemplatePattern {
public static void main(String[] args) {
TemplateImpl tImpl = new TemplateImpl();
tImpl.cooking();
}
@Override
public void addSpecies() {
System.out.println("添加盐酱醋");
}
@Override
public boolean isSweetPrefered() {
System.out.print("你喜欢甜食:");
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
try {
String str = bf.readLine();
if ("y".equalsIgnoreCase(str)) {
return true;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
}
下面是调用子类cooking()的结果:
在java源码中的数组的sort()方法其实也是用到了模板模式。还有java的swing,paint()方法。