魔术桌
  • 更新日志
  • 新闻资讯
  • 数据资产
  • 网站导航
  • 订阅推荐
  • 商品推广
  • 日记
  • 摘录
  • 论文
  • 方案
  • 技术
  • 风格
  • 视觉
  • 原材料
  • 加工工艺
  • 元器件
  • 产品设备
  • 设计模式
  • 数据结构
  • 算法设计
  • 软件架构
  • 程序语言
  • 代码类库
  • 操作系统
  • 软件包
  • 健康
  • 环境
  • 社会
  • 道德
  • 法律
  • 经济
  • 政策
  • 更新日志
  • 新闻资讯
  • 数据资产
  • 网站导航
  • 订阅推荐
  • 商品推广
  • 日记
  • 摘录
  • 论文
  • 方案
  • 技术
  • 风格
  • 视觉
  • 原材料
  • 加工工艺
  • 元器件
  • 产品设备
  • 设计模式
  • 数据结构
  • 算法设计
  • 软件架构
  • 程序语言
  • 代码类库
  • 操作系统
  • 软件包
  • 健康
  • 环境
  • 社会
  • 道德
  • 法律
  • 经济
  • 政策
  • DesignPattern - 模板方法模式

文章摘要: 模板方法模式使用总结。

简介

简要说明

  • 模板方法模式(Template Method Pattern)是一种行为型设计模式。
  • 通过在抽象类中定义一个模板方法来固定算法骨架,并将算法中的某些步骤留给子类实现。

主要功能

  • 在一个方法中定义一个算法的骨架,将具体的步骤实现延迟到子类中。
  • 通过钩子方法(hook methods)提供对算法步骤的控制,允许子类在不改变结构的情况下重新定义算法的某些步骤。

注意事项

  • 为防止恶意操作,模板方法可以被声明为final,确保它不会被覆盖。
  • 模板方法中的步骤可以被声明为protected,以便子类可以访问。
  • 应该仔细设计抽象类,确保其方法对于所有子类都有意义。

适用场景

  • 当多个算法步骤相同,只有部分步骤不同,并且这些不同步骤可以被抽象化时。
  • 当算法的骨架保持不变,而某些步骤的实现可能需要变化时。

Java 8

案例

// 抽象类,定义了模板方法和基本步骤
abstract class Game {
    // 模板方法,定义了算法的骨架
    public final void play() {
        initialize(); // 初始化游戏
        startPlay();  // 开始游戏
        endPlay();    // 结束游戏
    }

    // 基本步骤,由子类实现
    protected abstract void initialize();
    protected abstract void startPlay();
    protected abstract void endPlay();

    // 钩子方法,可以被覆盖以提供额外的行为
    protected void addExtraFeature() {
        // 默认实现,什么也不做
    }
}

// 具体子类,实现了抽象类中的基本步骤
class Cricket extends Game {
    @Override
    protected void initialize() {
        System.out.println("Cricket Game Initialized! Start playing.");
    }

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

    @Override
    protected void endPlay() {
        System.out.println("Cricket Game Finished!");
    }
}

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

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

    @Override
    protected void endPlay() {
        System.out.println("Football Game Finished!");
    }

    // 覆盖钩子方法以添加额外功能
    @Override
    protected void addExtraFeature() {
        System.out.println("Extra feature in Football: Penalty Shootout!");
    }
}

// 客户端代码,使用模板方法模式
public class TemplateMethodPatternDemo {
    public static void main(String[] args) {
        Game cricket = new Cricket();
        cricket.play();

        Game football = new Football();
        football.play();
    }
}

注释

  • 在这个例子中,Game是一个抽象类,它定义了模板方法play(),这个方法定义了玩游戏的步骤。它调用了三个抽象方法initialize()、startPlay()和endPlay(),这些方法在子类中实现。addExtraFeature()是一个钩子方法,它提供了在子类中添加额外行为的机会。
  • Cricket和Football是Game的具体子类,它们实现了父类中的抽象方法。Football类还覆盖了钩子方法addExtraFeature()来添加足球游戏特有的额外功能。
  • 客户端代码创建了Cricket和Football的实例,并调用它们的play()方法。由于play()方法是模板方法,它确保了游戏的步骤按照预定的顺序执行,同时允许子类自定义具体的实现。
更新时间: 2025/10/3 17:56