设计模式-04.模板方法模式
发布日期:2021-05-20 05:12:28 浏览次数:12 分类:精选文章

本文共 2389 字,大约阅读时间需要 7 分钟。

模板方法模式(Template Method Pattern)

模板方法模式是一种行为型设计模式,其核心思想是将一个操作的算法定义为一个抽象类中的模板,子类可以按需重写部分实现,但执行顺序和共享的部分由抽象类控制。这种设计模式尤其适用于处理多个子类共享一套算法的情况,允许子类灵活扩展和修改。

模板方法模式的定义

在模板方法模式中:

  • 抽象类声明一个操作的步骤模板,通常通过一个 final 方法实现。
  • 子类可以选择重写模板方法的某个步骤或是实现多个步骤。
  • 模板方法的执行顺序由抽象类控制,而可变部分由子类实现。

这种模式的具体过程包括:

  • 抽象类定义一个操作的基本架构,如一个方法 play,它包含一些步骤,这些步骤由其他方法实现。
  • 子类继承抽象类,并重写其中某些步骤或方法,通常只需要修改特定的操作逻辑。
  • 在运行时,模板方法的步骤按照抽象类定义的顺序被执行,子类的实现被适时调用。
  • 优点

    • 封装不变部分:共享的算法被封装在抽象类中,避免重复代码。
    • 易于维护:一旦抽象类中的某个共享步骤需要修改,所有子类都获益。
    • 遵循开闭原则:子类可以扩展行为,但父类的行为是不变的。

    缺点

    • 类的复杂性:随着子类数量增加,项目的类结构变得庞大。
    • 代码阅读难度:父类的行为对子类会有影响,增加了对新手的困扰。

    使用场景

    • 共享算法:多个子类共享一套算法,但每个子类只需修改部分步骤。
    • 重要或复杂的算法:将其核心逻辑设计为模板方法,确保所有子类遵循统一的逻辑流程。
    • 代码重构:将现有代码抽象出来,减少代码冗余,提高可维护性。

    实现示例

    假设有 Game 抽象类,其子类 CricketFootball 各自继承自 Game

    Game.java

    public abstract class Game {    public final void play() {        initialize(); // 初始化游戏        startPlay(); // 开始游戏        endPlay();   // 结束游戏    }    // 每一个具体的子类需要实现的方法    abstract void initialize();    abstract void startPlay();    abstract void endPlay();}

    Cricket.java

    public class Cricket extends Game {    @Override    void initialize() {        System.out.println("Cricket Game Initialized! Start playing.");    }    @Override    void startPlay() {        System.out.println("Cricket Game Started. Enjoy the game!");    }    @Override    void endPlay() {        System.out.println("Cricket Game Finished!");    }}

    Football.java

    public class Football extends Game {    @Override    void initialize() {        System.out.println("Football Game Initialized! Start playing.");    }    @Override    void startPlay() {        System.out.println("Football Game Started. Enjoy the game!");    }    @Override    void endPlay() {        System.out.println("Football Game Finished!");    }}

    TemplatePatternDemo.java

    public class TemplatePatternDemo {    public static void main(String[] args) {        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!

    这一示例展示了如何使用模板方法模式来实现两个不同的子类(Cricket 和 Football),每个子类按照自己的方式为 Game 抽象类的方法提供实现,而 play() 方法则是一致的,调用了所有步骤。

    总结

    模板方法模式通过将通用算法封装到抽象类中,允许子类按需扩展或重写个别步骤,从而实现了共享算法和灵活扩展的双重目标。这种模式尤其适用于需要多种行为并保持一致性操作的情况,用其优点和缺点综合考虑后,可以选择在代码中适当使用,提升系统的扩展性和可维护性。

    上一篇:设计模式-06.代理模式(Proxy Pattern)-静态代理
    下一篇:设计模式-03.抽象工厂模式

    发表评论

    最新留言

    初次前来,多多关照!
    [***.217.46.12]2025年05月02日 17时40分46秒