(二)模板设计模式

1.概念

1.1.是什么?

在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的实现类按需要重写方法实现,但调用的控制逻辑由抽象类控制。

1.2.设计结构

(二)模板设计模式_第1张图片
模板设计模式结构

①. 模板模式主要由抽象模板(Abstract Template)角色和具体模板(Concrete Template)角色组成。

  • 抽象模板:定义一些抽象操作,并且规定这些抽象操作的执行逻辑。
  • 具体模板:重定义这些抽象操作以提供具体的行为,不能修改整个模板的执行逻辑,可以实现丰富的方法操作。

②. 模板方法是一种代码复用的基本技术。它们在类库中尤为重要,它们提取了类库中的公共行为。模板方法导致一种反向的控制结构,这种结构有时被称为“好莱坞法则”,即“别找我们,我们找你”。这指的是一个父类调用一个子类的操作。

  • 在模版方法中定义了整个模板的骨架,同时还有公有的具体的操作,另外还应该具备必须实现的抽象操作和可实现的抽象操作(钩子操作)
  • 钩子操作,即一些非必需的省缺操作,通过子类实现是否需要该操作,对抽象类的控制逻辑产生影响。该钩子在抽象类中定义,因此父类默认控制逻辑中可以不需要该操作。简单来说,抽象类通过if判断是否执行某一个方法,而该判断权交给子类根据场景来个性化实现。

2.应用

  • 当多个相似事物在操作上步骤多数相同的情况下,将相同操作提为公有模块,而不同部分提为抽象操作,而使用重写来实现各自的逻辑。

3.案例

3.1.标准的模板设计模式

①. Abstract Template

  public abstract class TemplateDesignPatterns2 {

    /**
     * 模板方法执行逻辑,要用final关键字进行修饰,只可重写不可修改
     */
    public final void coreLogicMethod() {
        System.out.println("执行逻辑:");
        commonStart();
        uniqueStep();
        if (isHasCommonEnd()) {
            commonEnd();
        }
    }

    /**
     * 公共方法,逻辑一定执行
     */
    private void commonStart() {
        System.out.println("1.调用commonStart...");
    }

    /**
     * 子类必须重新实现方法,逻辑一定执行
     */
    protected abstract void uniqueStep();

    /**
     * 子类非必须重新实现方法,由子类根据场景重写钩子方法实现
     */
    protected void commonEnd() {
        System.out.println("3.调用commonEnd...");
    }

    /**
     * 钩子方法,控制commonEnd是否需要执行,默认执行
     */
    protected boolean isHasCommonEnd() {
        return true;
    }
}

②. Concrete Template

public class TemplateDesignPatterns2Impl extends TemplateDesignPatterns2{

    @Override
    protected void uniqueStep() {
        System.out.println("2.调用子类重写uniqueStep...");
    }

    @Override
    protected boolean isHasCommonEnd() {
        return false;
    }

    public static void main(String[] args) {
        TemplateDesignPatterns2 designPatterns2 = new TemplateDesignPatterns2Impl();
        designPatterns2.coreLogicMethod();
    }
}
  • 若子类根据业务场景,commonEnd()方法需要实现,则直接重写该方法,若该方法不需要,如上图控制钩子去掉。

3.2.对上述代码变相(类似thread中的调用方式)

public abstract class TemplateDesignPatterns {

    /**
     * 模板方法, 要用final关键字进行修饰,只可重写不可修改
     *
     * @return
     */
    public TemplateDesignPatterns start() {
        System.out.println("执行逻辑:");
        commonStep();
        uniqueStep();
        return null;
    }

    private void commonStep() {
        System.out.println("1.公用方法...调用commonStep");
    }

    protected abstract void uniqueStep();

    public static void main(String[] args) {
        //隐式实现该方法
        TemplateDesignPatterns designPattern = new TemplateDesignPatterns() {
            @Override
            protected void uniqueStep() {
                System.out.println("2.个性实现私有逻辑...调用uniqueStep");
            }
        };
        designPattern.start();
    }
}
  • 由于笔者阅读书中介绍:Thread的run和 start为一个典型的模板设计模式,但由于JNI调用具体过程无法得知,故此写了一个认为的类似实现,若有错误请多多赐教。

你可能感兴趣的:((二)模板设计模式)