一、定义与简单实现
1、定义
- 模板方法是一个定义在父类中的方法,
- 在模板方法中会顺序调用多个定义在父类中的其他方法,而这些方法有可能只是抽象方法,
- 模板方法保证了抽象方法的执行顺序,这些抽象方法由子类实现,并且子类不允许覆写模板方法。
2、UML类图
模板方法模式与工厂方法模式的UML类图实现都是父类定义抽象方法,然后将具体实现延迟到子类,但还是有区别的
- 模板方法模式是行为型设计模式,关注的是对象之间交流,可以是一个没有返回值的方法。
- 工厂方法模式是创建型设计模式,关注的是对象的创建,必须返回一个创建好的对象。
模板方法模式中的设计原则:
- 封装变化(抽象方法)
- 依赖抽象,不依赖具体类
- 对扩展开放,对修改关闭
3、简单代码实现
public interface TemplateService { void templateMethod(); } public abstract class AbstractTemplateService implements TemplateService { @Override public void templateMethod() { //模板方法中的钩子方法isDoSomething1,子类可以改变方法执行顺序 if(isDoSomething1()){ doSomething1(); } doSomething2(); doSomething3(); } protected boolean isDoSomething1(){ return true; } protected void doSomething1(){ System.out.println("something1 start"); } /** * 子类不必实现,可以是空方法 */ protected void doSomething2(){ } protected abstract void doSomething3(); } public class ATemplateServiceImp extends AbstractTemplateService { @Override protected void doSomething3() { System.out.println("I am A"); } } public class BTemplateServiceImp extends AbstractTemplateService { @Override protected boolean isDoSomething1() { return false; } @Override protected void doSomething2() { System.out.println("I am B"); } @Override protected void doSomething3() { //empty } } public class Main { public static void main(String[] args) { TemplateService template = new ATemplateServiceImp(); template.templateMethod(); template = new BTemplateServiceImp(); template.templateMethod(); } }
二、框架中的模板方法模式
1、springIOC容器初始化