1 模板模式介绍

模板模式是一种行为设计模式,它定义了一个算法的框架,把一些步骤推迟到子类中实现。

这个模板的本身并不实现这些步骤,而是提供了一些列抽象方法,让子类来实现这些抽象方法。这样做的好处是可以在不修改算法的情况下,通过不同子类的实现方法,扩展算法的行为。此外,模板模式还可以用来遵循“开闭原则”,将不同的行为封装在子类中,使得父类可以保持稳定,而子类可以灵活扩展。

📌 场景

在大量重复的业务逻辑中,通过将公共的部分抽象成一个模板方法来避免代码重复。为防止恶意操作,一般模板方法都会加上 final关键词。

📌 优点

  1. 封装了不变的部分,扩展可变的部分。
  2. 提取公共部分代码,便于维护。
  3. 模板方法模式是一种代码复用的基本技术。

📌 缺点

  1. 如果过度使用模板模式,会导致系统变得复杂和难以维护。
  2. 由于模板方法模式使用了继承,因此会受到Java单继承限制。
  3. 如果子类中的某一方法被修改,则需要修改模板方法或其他子类的实现,可能会引起一定的风险。

2 模板模式实现

以医院看病为例:

📌 1.定义抽象疾病

/**
 * 疾病
 */
public abstract class Disease {
    /**
     * 治病
     */
    public void cure() {
        // 1、挂号
        registered();
        // 2、排队
        queue();
        // 3、检查
        check();
        // 4、治疗
        treat();
    }

    /**
     * 挂号
     */
    public void registered() {
        System.out.println("1、挂号");
    }

    /**
     * 排队
     */
    public void queue() {
        System.out.println("2、排队");
    }

    /**
     * 检查
     */
    public abstract void check();

    /**
     * 治疗
     */
    public abstract void treat();
}

📌 2.定义具体疾病

① 感冒

/**
 * 感冒
 */
public class Cold extends Disease {
    @Override
    public void check() {
        System.out.println("3、感冒检查:量体温");
    }

    @Override
    public void treat() {
        System.out.println("4、感冒开药:感冒灵");
    }
}

① 口腔溃疡

/**
 * 口腔溃疡
 */
public class MouthUlcers extends Disease {
    @Override
    public void check() {
        System.out.println("3、口腔溃疡检查:看口腔");
    }

    @Override
    public void treat() {
        System.out.println("4、口腔溃疡开药:西瓜霜");
    }
}

📌 3.调用

public class Client {
    public static void main(String[] args) {
        // 感冒
        Disease cold = new Cold();
        // 口腔溃疡
        Disease mouthUlcers = new MouthUlcers();
        // 治疗感冒
        cold.cure();
        // 治疗口腔溃疡
        mouthUlcers.cure();
    }
}

控制台输出:

可以发现,在治疗感冒和口腔溃疡这两种疾病时,前两个步骤是一样的,只有后两个步骤是不同的,这样就实现了复用相同的步骤,后续再定义其他疾病时只需要继承 Disease 实现其抽象方法即可,复用性扩展性都大大提高。

04-16 19:14