模板方法模式(附C++代码示例)

模板方法模式的含义

模板方法模式(Template Method Pattern)是一种行为设计模式,它在父类中定义一个算法的框架,允许子类在不改变算法结构的情况下重新定义算法的某些步骤。这种模式是基于继承的:它通过把不变的行为搬移到超类,去除子类中的重复代码来体现它的优势。

核心思想及解释

模板方法模式的核心思想是处理算法框架的步骤编排在一个方法中,延迟步骤的具体实现到子类。通过这种方式,模板方法使得子类可以在不改变算法结构的前提下,通过重定义算法的某些特定步骤来重新定义该算法的某些特定部分。

为什么要使用模板方法模式

  1. 代码复用:模板方法可以将共同的代码移动到单一位置,减少代码冗余。
  2. 扩展性:提供了一个非常灵活的结构,以便当程序的某些部分变化时,用户只需要更改算法的某些特定部分,而不是整个算法。
  3. 固化算法结构:在基类中固定算法的步骤,保证子类扩展时不会改变这些步骤的执行顺序。

使用模板方法模式需要注意的点

  1. 限制灵活性:模板方法可能会导致设计比较僵硬,因为算法的框架是固定的。
  2. 引导子类设计:模板方法定义了子类的部分行为,子类实现时必须遵循这一框架。
  3. 不宜过度使用:如果只有很小的部分需要变化,可能没有必要使用模板方法模式。

工程的应用场景

  1. 工作流处理程序:在处理数据或执行任务时,需要固定的步骤,但每个步骤的具体实现可能因情况而异。
  2. 数据分析的多个步骤:例如,数据需要预处理、分析和后处理,这些步骤的框架相同,但具体内容可能因数据不同而不同。
  3. 游戏中的AI行为设计:游戏中不同类型的AI可能有相似的行为模式,但具体决策或行动细节不同。

示例代码及解释

假设我们要实现一个多平台的游戏,游戏在不同平台(如Windows和Linux)上的初始化和清理过程不同,但游戏的启动和结束流程是相同的。

首先,定义抽象基类和模板方法:

#include <iostream>

class Game 
{
public:
    // 模板方法
    void play() 
    {
        setup();    // 设置环境
        start();    // 开始游戏
        end();      // 结束游戏
        cleanup();  // 清理环境
    }

    virtual ~Game() {}

protected:
    virtual void setup() = 0;
    virtual void start() = 0;
    virtual void end() = 0;
    virtual void cleanup() = 0;
};

class WindowsGame : public Game 
{
protected:
    void setup() override 
    {
        std::cout << "Setup Windows Game environment." << std::endl;
    }

    void start() override 
    {
        std::cout << "Start Game on Windows." << std::endl;
    }

    void end() override 
    {
        std::cout << "End Game on Windows." << std::endl;
    }

    void cleanup() override 
    {
        std::cout << "Cleanup Windows Game environment." << std::endl;
    }
};

class LinuxGame : public Game 
{
protected:
    void setup() override 
    {
        std::cout << "Setup Linux Game environment." << std::endl;
    }

    void start() override 
    {
        std::cout << "Start Game on Linux." << std::endl;
    }

    void end() override 
    {
        std::cout << "End Game on Linux." << std::endl;
    }

    void cleanup() override 
    {
        std::cout << "Cleanup Linux Game environment." << std::endl;
    }
};

客户端代码:

int main() 
{
    Game* game = new WindowsGame();
    game->play();
    delete game;

    std::cout << "\n";

    game = new LinuxGame();
    game->play();
    delete game;

    return 0;
}

输出代码运行结果

Setup Windows Game environment.
Start Game on Windows.
End Game on Windows.
Cleanup Windows Game environment.

Setup Linux Game environment.
Start Game on Linux.
End Game on Linux.
Cleanup Linux Game environment.

这个示例展示了模板方法模式如何在游戏启动流程中实现平台特定的操作,同时保持游戏流程的一致性。通过定义抽象基类Game并在其中实现模板方法play,我们确保了游戏的主流程固定,而平台特定的细节则在派生类中实现。这种设计方式使得游戏的主要流程易于理解和维护,同时也提供了足够的灵活性来处理不同平台间的差异。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Warren++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值