定义:定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
类图
抽象模板类
package com.freeflying.designmodle.templatemethod;
/**
* 抽象模板类
* @ClassName: AbstractTemplateClass
* @Description:
* @author freeflying
* @date 2018年8月1日
*/
public abstract class AbstractTemplateClass {
//基本方法
public abstract void doSomeThing();
public abstract void doAnyThing();
//模板方法
public void templateMethod() {
//调用基本方法
this.doSomeThing();
this.doAnyThing();
}
}
具体模板类
package com.freeflying.designmodle.templatemethod;
/**
* 具体模板类1
* @ClassName: ConcreteTemplateClass1
* @Description:
* @author freeflying
* @date 2018年8月1日
*/
public class ConcreteTemplateClass1 extends AbstractTemplateClass{
@Override
public void doSomeThing() {
}
@Override
public void doAnyThing() {
}
}
package com.freeflying.designmodle.templatemethod;
/**
* 具体模板类2
* @ClassName: ConcreteTemplateClass1
* @Description:
* @author freeflying
* @date 2018年8月1日
*/
public class ConcreteTemplateClass2 extends AbstractTemplateClass{
@Override
public void doSomeThing() {
}
@Override
public void doAnyThing() {
}
}
package com.freeflying.designmodle.templatemethod;
/**
* 场景类
* @ClassName: Client
* @Description:
* @author freeflying
* @date 2018年8月1日
*/
public class Client {
public static void main(String[] args) {
AbstractTemplateClass concreteTemplaateClass1=new ConcreteTemplateClass1();
AbstractTemplateClass concreteTemplaateClass2=new ConcreteTemplateClass2();
concreteTemplaateClass1.templateMethod();
concreteTemplaateClass2.templateMethod();
}
}
优点
封装不变部分,扩展了可边部分
把认为不变部分的算法封装到了父类实现,而可变部分的则可以通过继承来继续扩展
提取公共部分代码,便于维护
行为由父类控制,子类实现
基本方法由子类实现的,因此子类可以通过扩展的方式增加相应的功能,符合原则
模板方法模式的使用场景
多个子类有共有的方法,并且逻辑基本相同
重要、复杂的算法,可以把核心算法设计为模板方法, 周边的相关细节功能则由各个子类实现
重构时,模板方法模式把相同的代码抽取到了父类中,然后通过钩子函数约束其行为