设计模式二十三:模板方法模式(Template Method Pattern)

定义了一个算法的框架,将算法的具体步骤延迟到子类中实现。这样可以在不改变算法结构的情况下,允许子类重写算法的特定步骤以满足自己的需求

模版方法使用场景

  1. 算法框架固定,但具体步骤可以变化:当你有一个算法的整体结构是固定的,但其中某些步骤的实现可能因情境不同而变化时,可以使用模板方法模式。这使得你可以在不改变整体结构的情况下,通过子类来定制特定步骤的实现。
  2. 避免代码重复:当你有多个类中的方法具有相似的步骤,但实现细节有所不同时,可以将这些相似的步骤提取到一个抽象类的模板方法中,从而避免代码重复。
  3. 框架或库的设计:在框架或库的设计中,通常会定义一些通用的算法框架,但具体实现需要留给使用者来完成。模板方法模式在这种情况下可以帮助定义框架的核心逻辑,同时留下扩展点供使用者进行自定义。
  4. 生命周期方法:当需要确保对象在特定的生命周期阶段执行特定步骤时,模板方法模式可以派上用场。比如在资源管理、初始化和销毁等场景下。
  5. 代码的扩展和维护:模板方法模式遵循开闭原则,当需要添加新的功能或修改算法的部分步骤时,只需要新增或修改子类,而不需要改动抽象类的代码,从而提升了代码的可扩展性和可维护性。

模版方法主要角色

  1. 抽象类(Abstract Class):定义了一个模板方法,它是一个包含算法框架的方法,其中的具体步骤可以是抽象方法或已实现的方法。抽象类还可以包含一些通用方法,这些方法在模板方法中被使用。
  2. 具体子类(Concrete Subclass):继承抽象类并实现其中的抽象方法,从而完成算法的具体步骤。每个具体子类可以根据需要实现自己的逻辑。

模版方法java代码实例

abstract class CaffeineBeverage {
    final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    abstract void brew();

    abstract void addCondiments();

    void boilWater() {
        System.out.println("Boiling water");
    }

    void pourInCup() {
        System.out.println("Pouring into cup");
    }
}

class Coffee extends CaffeineBeverage {
    void brew() {
        System.out.println("Dripping coffee through filter");
    }

    void addCondiments() {
        System.out.println("Adding sugar and milk");
    }
}

class Tea extends CaffeineBeverage {
    void brew() {
        System.out.println("Steeping the tea");
    }

    void addCondiments() {
        System.out.println("Adding lemon");
    }
}

public class TemplateMethodPatternDemo {
    public static void main(String[] args) {
        CaffeineBeverage coffee = new Coffee();
        coffee.prepareRecipe();

        CaffeineBeverage tea = new Tea();
        tea.prepareRecipe();
    }
}

在这个示例中,CaffeineBeverage 是抽象类,定义了制作咖啡因饮料的模板方法 prepareRecipe(),以及具体步骤中的通用方法。Coffee 和 Tea 是具体子类,分别实现了 brew() 和 addCondiments() 方法。在主程序中,我们创建了咖啡和茶的实例,并调用了它们的 prepareRecipe() 方法,实现了整个制作过程

模版方法优缺点

优点:

  1. 代码复用性
    模板方法模式鼓励将相同的代码逻辑放在抽象类中,从而避免在多个具体类中重复实现相同的代码,提高了代码的复用性。
  2. 高层逻辑抽象
    模板方法将高层的算法逻辑抽象到抽象类中,使得具体子类只需要关注特定步骤的实现,而无需考虑整体算法的结构。
  3. 固定算法框架
    模板方法定义了一个算法的框架,确保了整个算法的结构一致性。这有助于遵循最佳实践并减少错误。
  4. 易于维护
    由于相同的代码逻辑集中在抽象类中,修改算法逻辑或添加新特性只需要在一个地方进行修改,减少了维护的复杂性。
  5. 灵活性
    具体子类可以通过重写特定步骤来实现个性化需求,从而在保持整体框架不变的情况下增加灵活性。

缺点:

  1. 限制子类的自由度
    尽管模板方法模式提供一定程度的灵活性,但子类的扩展通常被限制在模板定义的框架内。这可能导致某些情况下子类需要强行适应框架,而不是完全自由地设计。
  2. 增加类的数量
    使用模板方法模式通常会引入抽象类和具体子类,可能会增加类的数量,增加了代码的复杂性。
  3. 不适合每个情况
    并非所有算法都适合使用模板方法模式。如果算法的步骤变化较小或步骤变化较大,使用其他模式可能更合适。
  4. 复杂性增加
    尽管模板方法模式可以帮助整理算法的结构,但在某些情况下可能会引入复杂性,尤其是当算法本身变得复杂时

你可能感兴趣的:(设计模式,java,设计模式,模板方法模式)