哇塞码农设计模式系列 -- 模板方法模式

更新于2024-11-05 08:01:005 分钟2 千字4021277000
摘要

模板方法模式

模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,并允许子类重写其中的某些步骤,而不改变算法的结构。模板方法模式通过将算法的不变部分抽象成父类的模板方法,而将可变部分由子类来实现,从而实现了代码复用和扩展。

在模板方法模式中,有以下几个关键角色:

  1. AbstractClass(抽象类):定义了一个模板方法 templateMethod(),该方法定义了算法的骨架,其中包含了若干个步骤,某些步骤可能由子类实现。抽象类还可能包含一些抽象方法,这些方法由子类来实现。
  2. ConcreteClass(具体类):实现了抽象类定义的模板方法中的具体步骤,以及抽象方法的具体实现。具体类可以根据需要重写模板方法中的某些步骤,从而改变算法的行为。

UML类图

PlantUML Image

Java示例

// 抽象类
abstract class AbstractClass {
    // 模板方法,定义了算法的骨架
    public final void templateMethod() {
        // Step 1
        primitiveOperation1();
        // Step 2
        primitiveOperation2();
    }

    // 抽象方法,由子类实现
    protected abstract void primitiveOperation1();

    // 抽象方法,由子类实现
    protected abstract void primitiveOperation2();
}

// 具体类
class ConcreteClass extends AbstractClass {
    // 实现抽象方法 primitiveOperation1
    @Override
    protected void primitiveOperation1() {
        System.out.println("ConcreteClass: Primitive Operation 1");
    }

    // 实现抽象方法 primitiveOperation2
    @Override
    protected void primitiveOperation2() {
        System.out.println("ConcreteClass: Primitive Operation 2");
    }
}

// 客户端代码
public class Main {
    public static void main(String[] args) {
        // 创建具体类对象
        AbstractClass abstractClass = new ConcreteClass();
        // 调用模板方法
        abstractClass.templateMethod();
    }
}

适用场景

模板方法模式适用于以下场景:

  1. 定义算法的骨架:当有一个算法的整体结构已经确定,但具体步骤的实现可能因为不同的情况而变化时,可以使用模板方法模式。模板方法模式允许将算法的骨架抽象成一个模板方法,在其中定义算法的整体结构,然后由子类来实现具体的步骤。
  2. 避免代码重复:当有多个类中包含相同的操作步骤,但具体实现可能不同时,可以使用模板方法模式。通过将相同的操作步骤抽象成模板方法,可以避免在每个类中重复实现相同的代码。
  3. 提高代码复用性:当有多个类中包含相同的操作步骤,但具体实现可能有所不同,并且希望这些类能够共享相同的算法结构时,可以使用模板方法模式。模板方法模式允许将共享的算法结构抽象成一个模板方法,从而提高了代码的复用性。
  4. 控制算法的流程:当希望在算法的执行过程中能够控制算法的流程,并且允许子类来改变算法的某些步骤时,可以使用模板方法模式。模板方法模式允许将算法的流程控制在模板方法中,而具体的步骤由子类来实现。
  5. 框架设计:当设计一个框架或库时,可以使用模板方法模式来定义一些公共的行为或算法,并允许用户通过子类来定制或扩展这些行为或算法。模板方法模式可以作为框架设计中的一种常用模式。

总的来说,模板方法模式适用于需要定义算法的整体结构,并允许子类来实现具体步骤的场景。它提供了一种灵活的方式来定义算法,并允许在运行时改变算法的行为。

评论区

你认为这篇文章怎么样?
  • great
    0
  • happy
    0
  • doubt
    0
  • boring
    0
  • bad
    0

0/2048