定义:
- 定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
通用类图:
模板方法模式通用类图-
模板方法可以有一个或者几个,一般是一个具体的方法,也就是一个框架,实现对基本方法的调度,完成固定的逻辑。为了防止恶意的操作,一般的模板方式都加上final关键字,不允许被覆写。
public abstract class TempletMethod {
// 基本方法,通常使用protect 不需要暴露的方法尽量将访问权 限降低
protected abstract void MethodFirst();protected abstract void MethodSecond(); // 模板方法 public final void templetMethod() { MethodFirst(); MethodSecond(); } } public class TempletMethodSon extends TempletMethod { @Override protected void MethodFirst() { // TODO Auto-generated method stub } @Override protected void MethodSecond() { // TODO Auto-generated method stub } } public class Client { public static void main(String[] args) { TempletMethod tm = new TempletMethodSon(); tm.templetMethod(); } }
模板方法模式的拓展:
拓展模板方法模式public abstract class BaseModel {
protected abstract void methodOne();
protected abstract void methodTwo();
protected abstract void methodThree();
final void together() {
methodOne();
methodTwo();
if (hook()) {
methodThree();
}
}
protected Boolean hook() {
return true;
}
}
public class ModelOne extends BaseModel {
private boolean tag = true;// 默认实现方法三
@Override
protected void methodOne() {
// TODO Auto-generated method stub
}
@Override
protected void methodTwo() {
// TODO Auto-generated method stub
}
@Override
protected void methodThree() {
// TODO Auto-generated method stub
}
@Override
protected Boolean hook() {
// TODO Auto-generated method stub
return this.tag;
}
// 提供设置标志位的方法
public boolean setTag(Boolean tag) {
try {
this.tag = tag;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
return true;
}
}
父类怎么调用子类中的方法(强烈不建议使用,违背模板方法模式。子类定义出自身的特有方式,通过父类中定义的公共方法确认执行顺序)
- 把子类传递到父类的有参构造中,然后调用。
- 使用反射的方式调用。
- 父类调用子类中的静态方法
网友评论