【设计模式】04-模板方法模式

模板方法模式

源码:https://github.com/sdlszjb/DesignPattern

定义

定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的特定步骤。

/**
 * created by lsk on 2018-02-24 17:47.
 *
 * 抽象模板类
 *
 * @author 庄壮壮
 */
public abstract class TemplateAbstractClass {
    // 基本方法
    protected abstract void doSomething();

    // 基本方法
    protected abstract void doAnything();

    /**
     * 模板方法,一般为final
     */
    public final void templateMethod() {
        this.doSomething();
        this.doAnything();
    }
}

/**
 * created by lsk on 2018-02-24 17:48.
 *
 * 具体模板类 1
 *
 * @author 庄壮壮
 */
public class TemplateConcreteClass1 extends TemplateAbstractClass{
    @Override
    protected void doSomething() {
        System.out.println("Concrete 1 doSomething");
    }

    @Override
    protected void doAnything() {
        System.out.println("Concrete 1 doAnything");
    }
}

/**
 * created by lsk on 2018-02-24 17:48.
 *
 * 具体模板类 2
 *
 * @author 庄壮壮
 */
public class TemplateConcreteClass2 extends TemplateAbstractClass{
    @Override
    protected void doSomething() {
        System.out.println("Concrete 2 doSomething");
    }

    @Override
    protected void doAnything() {
        System.out.println("Concrete 2 doAnything");
    }
}

/**
 * created by lsk on 2018-02-24 17:50.
 *
 * @author 庄壮壮
 */
public class TemplateTests {

    @Test
    public void testClient() {
        TemplateAbstractClass c1 = new TemplateConcreteClass1();
        TemplateAbstractClass c2 = new TemplateConcreteClass2();

        c1.templateMethod();
        c2.templateMethod();
    }
}

一般情况下,抽象模板中的基本方法尽量设计为protected类型;实现类若非必要,尽量不要扩大父类中的访问权限。

优点

  • 封装不变部分,扩展可变部分
  • 提取公共部分代码,便于维护
  • 行为由父类控制,子类实现

缺点

  • 子类执行结果影响父类结果,在复杂系统中,会带来代码阅读的难度。

使用场景

  • 多个子类由共有的方法,并且逻辑相同
  • 重要、复杂的算法,把核心算法设计为模板方法,周边功能由子类实现。
  • 重构时,把相同的代码放到父类中,然后,通过钩子函数,约束其行为。

扩展

  • 模板方法按照一定的顺序调用基本方法。为其设置钩子方法(HookMethod)可决定公共部分的执行结果。

最佳实践

当你想在父类中调用子类方法的时候。。。

posted @ 2018-03-14 21:27  新崔斯特姆的营地  阅读(137)  评论(0编辑  收藏  举报