模板方法模式定义
其定义如下:
Define the skeleton of an algorithm in an operation,deferring some steps to ubclasses.TemplateMethod lets subclasses redefine certain steps of an algorithm without changing the algorithm’sstructure.(定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。)
模板方法模式类图
模板方法模式的应用
优点
- 封装不变部分,扩展可变部分
- 提取公共部分代码,便于维护
- 行为有父类控制,子类实现
缺点
按照我们的设计习惯,抽象类负责声明最抽象、最一般的事物属性和方法,实现类完成具体的事物属性和方法。但是模板方法模式却颠倒了,抽象类定义了部分抽象方法,由子类实现,子类执行的结果影响了父类的结果,也就是子类对父类产生了影响,这在复杂的项目中,会带来代码阅读的难度,而且也会让新手产生不适感。
模板方法模式的扩展
子类根据需求,选择是否重写钩子方法
public abstract class AbstractClass {
public abstract void doAnything();
public abstract void doSomething();
public void templateMethond() {
/**
* 逻辑处理
*/
if (isAny()) {
this.doAnything();
}
this.doSomething();
}
//钩子方法,默认执行doAnything
protected boolean isAny() {
return true;
}
}
客户端通过set*()自由控制anything
public class ConcreteClass1 extends AbstractClass {
private boolean isAny;
@Override
public void doAnything() {
}
@Override
public void doSomething() {
}
@Override
protected boolean isAny() {
return this.isAny;
}
public void setAny(boolean any) {
isAny = any;
}
}