设计模式——模板方法模式

一、定义与简单实现

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容器初始化

 

上一篇:C++关键字protected


下一篇:Abp vNext 番外篇-疑难杂症丨浅谈扩展属性与多用户设计