设计模式(14/23) - 模板方法模式

163 阅读3分钟

模板方法模式

1 概述

  • 模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个算法的骨架,并允许子类在不改变算法结构的情况下重新定义算法的某些步骤。模板方法模式使得子类可以在保留算法整体结构的情况下,灵活地扩展或修改算法的某些部分。
  • 这种模式通过一个抽象类来定义算法的骨架,具体步骤的实现则由子类提供,从而实现了算法的复用和扩展。

2 优缺点及应用场景

2.1 优点

  • 1)代码复用:将相同的代码放在抽象类中,避免重复,增强代码复用性。
  • 2)灵活性:子类可以通过扩展或修改模板方法中的步骤,来实现特定的行为。
  • 3)易于维护:算法的主干在一个地方定义,子类仅需重写具体步骤,便于维护和扩展。

2.2 缺点

  • 1)增加类的数量:需要创建多个子类来实现不同的行为,可能会增加系统的复杂性。
  • 2)继承关系限制:模板方法模式基于继承关系,子类必须继承抽象类,可能会限制某些灵活性。

2.3 应用场景

  • 1)算法骨架固定:算法的整体流程是固定的,但某些步骤是可变的情况。
  • 2)复用算法代码:多个子类共享相同的算法结构,但在某些步骤上有所不同的情况。
  • 3)行为扩展:需要在不修改算法整体结构的前提下,通过子类来扩展或修改算法的某些步骤。

3 结构

  • 1)抽象类(AbstractClass):定义算法的骨架,并声明一些抽象的基本方法,供子类实现。
  • 2)具体类(ConcreteClass):实现抽象类中定义的抽象方法,从而完成具体的算法步骤。

4 实现

4.1 UML 类图

模板方法模式.jpg

4.2 代码示例

// 创建一个抽象类,它的模板方法被设置为 final
abstract class Game {
  abstract void initialize();

  abstract void startPlay();

  abstract void endPlay();

  // 模板
  public final void play() {

    // 初始化游戏
    initialize();

    // 开始游戏
    startPlay();

    // 结束游戏
    endPlay();
  }
}

// 创建扩展了上述类的实体类:板球
class Cricket extends Game {
  @Override
  void endPlay() {
    System.out.println("Cricket Game Finished!");
  }

  @Override
  void initialize() {
    System.out.println("Cricket Game Initialized! Start playing.");
  }

  @Override
  void startPlay() {
    System.out.println("Cricket Game Started. Enjoy the game!");
  }
}

// 创建扩展了上述类的实体类:足球
class Football extends Game {
  @Override
  void endPlay() {
    System.out.println("Football Game Finished!");
  }

  @Override
  void initialize() {
    System.out.println("Football Game Initialized! Start playing.");
  }

  @Override
  void startPlay() {
    System.out.println("Football Game Started. Enjoy the game!");
  }
}

// 使用示例
public class TemplateMethodPatternDemo {
  public static void main(String[] args) {
    // 使用 Game 的模板方法 play() 来演示游戏的定义方式
    Game game = new Cricket();
    game.play();
    System.out.println();
    game = new Football();
    game.play();
  }
}
  • 执行程序,输出结果:
Cricket Game Initialized! Start playing.
Cricket Game Started. Enjoy the game!
Cricket Game Finished!

Football Game Initialized! Start playing.
Football Game Started. Enjoy the game!
Football Game Finished!

5 总结

  • 模板方法模式通过定义一个算法的骨架,并允许子类在不改变算法结构的情况下重新定义算法的某些步骤,实现了代码复用和行为扩展。模板方法模式适用于算法整体流程固定,但某些步骤可变的情况,通过继承和多态实现具体步骤的灵活性。尽管模板方法模式增加了类的数量,但它在复用算法代码和易于维护方面具有显著优势。在实际应用中,需要根据具体需求合理使用模板方法模式,以实现灵活可扩展的系统设计。