模板方法

2021-10-02   


模板方法

前言

  忙了一段时间终于空了下来,总算可以抽出时间来进行代码重构_(:з」∠)_。此前在写业务代码时已经使用了策略工厂的设计模式来进行不同业务的统一处理。但是发现不同的策略里依旧有部分代码重复。对于一个强迫症患者来说代码重复一点有空间来进行优化,最简单的方式是提取出公用代码来统一调用,但是这样似乎毫无美感。同时对于这部分"重复"的代码,我发现似乎整个方法"骨架"是类似的,只是其中的某些实现步骤不尽相同。这时候答案似乎就在眼前了,AQS中使用的模板方法。

简介

  模板方法模式是一种行为设计模式,它在超类中定义一个算法的框架,将具体的方法延迟到子类中去实现。子类在不改变整体算法步骤的情况下,可以自定义得实现自身特定的处理逻辑。

适用场景

  当我们希望子类只来实现某个特定步骤,而不去变动整体的业务流程时,我们可以将整个流程抽象为一系列独立的步骤,以便在子类中进行覆写或拓展。
  在策略模式中,多个不同的策略处理行为除了一些细微的不同,对于输入和输出的处理却是一致的。此时我们便可以将整体的实现方式提取到超类(抽象类)以此来去除我们的重复代码。而各策略之间不同的处理则由各自来实现抽象方法。

demo

超类

public abstract class AbstractAlgorithm {

    /**
     * 算法框架
     */
    public void doSomething() {
        //do A
        System.out.println("do some thing A");
        //do B
        System.out.println("do some thing B");
        doDifferentThing();
        //do C
        System.out.println("do some thing C");
    }

    /**
     * 由子类各自实现具体逻辑
     */
    public abstract void doDifferentThing();

}

算法1

public class Algorithm1 extends AbstractAlgorithm{

    @Override
    public void doDifferentThing() {
        System.out.println("my name is algorithm");
    }

}

算法2

public class Algorithm2 extends AbstractAlgorithm{

    @Override
    public void doDifferentThing() {
        System.out.println("my name is algorithm2");
    }

}

测试

public class TestAlgorithm {

    public static void main(String[] args) {
        AbstractAlgorithm algorithm1 = new Algorithm1();
        AbstractAlgorithm algorithm2 = new Algorithm2();
        algorithm1.doSomething();
        algorithm2.doSomething();
    }

}
其他

  至此,似乎又学会了一种奇淫巧技:策略工厂+模板方法。重复的代码没有了,对于特定的业务也实现了统一的算法框架定义。后续拓展策略时可选择按照目前的骨架进行逻辑处理,也可以选择不继承超类重新实现算法步骤。

Q.E.D.