当前位置: 首页 > news >正文

上海wordpress建站广东富盈建设有限公司企业网站

上海wordpress建站,广东富盈建设有限公司企业网站,网站设计 深圳,做自媒体网站开发模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个算法的骨架,将某些步骤延迟到子类中实现。这种模式让子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤,从而实现代码复…

模板方法模式(Template Method Pattern)是一种行为型设计模式,它定义了一个算法的骨架,将某些步骤延迟到子类中实现。这种模式让子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤,从而实现代码复用和扩展。

模板方法模式的核心角色

  1. AbstractClass(抽象类):定义算法的骨架(模板方法),包含多个抽象方法(步骤)和可能的钩子方法
  2. ConcreteClass(具体子类):实现抽象类中的抽象方法,完成算法中特定于子类的步骤

C++实现示例

以下以"饮料制作流程"为例实现模板方法模式,冲泡咖啡和泡茶的流程相似(都需要煮水、冲泡、倒杯、加调料),但具体步骤存在差异:

#include <iostream>
#include <string>// 抽象类:饮料
class Beverage {
public:// 模板方法:定义算法骨架,声明为final防止子类重写void prepareRecipe() final {boilWater();    // 步骤1:煮水brew();         // 步骤2:冲泡(抽象方法,子类实现)pourInCup();    // 步骤3:倒杯if (customerWantsCondiments()) {  // 钩子方法:判断是否需要加调料addCondiments();  // 步骤4:加调料(抽象方法,子类实现)}}// 抽象方法:冲泡(子类实现)virtual void brew() = 0;// 抽象方法:加调料(子类实现)virtual void addCondiments() = 0;// 具体方法:煮水(所有饮料通用)void boilWater() {std::cout << "煮水" << std::endl;}// 具体方法:倒杯(所有饮料通用)void pourInCup() {std::cout << "倒入杯子中" << std::endl;}// 钩子方法:默认返回true(需要加调料),子类可重写virtual bool customerWantsCondiments() {return true;}// 虚析构函数virtual ~Beverage() = default;
};// 具体子类:咖啡
class Coffee : public Beverage {
public:// 实现冲泡步骤void brew() override {std::cout << "用沸水冲泡咖啡粉" << std::endl;}// 实现加调料步骤void addCondiments() override {std::cout << "加入糖和牛奶" << std::endl;}// 重写钩子方法:询问用户是否需要加调料bool customerWantsCondiments() override {std::string answer;std::cout << "咖啡需要加奶和糖吗?(y/n): ";std::cin >> answer;return answer == "y" || answer == "Y";}
};// 具体子类:茶
class Tea : public Beverage {
public:// 实现冲泡步骤void brew() override {std::cout << "用沸水浸泡茶叶" << std::endl;}// 实现加调料步骤void addCondiments() override {std::cout << "加入柠檬" << std::endl;}// 重写钩子方法:默认不加调料bool customerWantsCondiments() override {return false;  // 茶默认不加柠檬}
};// 客户端代码
void makeBeverage(Beverage* beverage) {std::cout << "\n开始制作饮料..." << std::endl;beverage->prepareRecipe();std::cout << "饮料制作完成" << std::endl;
}int main() {// 制作咖啡Beverage* coffee = new Coffee();makeBeverage(coffee);// 制作茶Beverage* tea = new Tea();makeBeverage(tea);// 清理资源delete coffee;delete tea;return 0;
}

代码解析

  1. 模板方法(prepareRecipe

    • 定义了饮料制作的固定流程(煮水→冲泡→倒杯→加调料),用final修饰防止子类修改算法结构
    • 其中boilWaterpourInCup是通用步骤(具体方法),brewaddCondiments是抽象步骤(由子类实现)
  2. 抽象方法(brewaddCondiments

    • 声明为纯虚函数,强制子类实现,这些步骤是算法中因具体类型而异的部分
    • 咖啡实现为"冲泡咖啡粉"和"加糖牛奶",茶实现为"浸泡茶叶"和"加柠檬"
  3. 钩子方法(customerWantsCondiments

    • 提供默认实现(返回true),子类可根据需要重写
    • 咖啡重写为询问用户是否加调料,茶重写为默认不加调料,增强了算法的灵活性
  4. 子类扩展

    • 子类通过实现抽象方法定制特定步骤,无需修改算法整体结构
    • 钩子方法允许子类有选择地参与算法,而非强制实现所有步骤

模板方法模式的优缺点

优点

  • 封装不变部分,扩展可变部分,实现代码复用(通用步骤在父类实现)
  • 子类专注于实现特定步骤,无需关心算法整体结构
  • 通过钩子方法提供灵活的扩展点,增强了适应性
  • 符合开放-封闭原则(扩展新子类无需修改父类)

缺点

  • 父类中的抽象方法过多时,会导致子类实现负担加重
  • 算法骨架被固定在父类,如需修改整体流程需修改父类,违反开放-封闭原则
  • 可能增加系统复杂度(引入多个子类)

适用场景

  • 当多个子类存在公共行为(算法步骤),且这些行为的结构相同但细节不同时
  • 当需要控制子类扩展时(通过钩子方法限制扩展范围)
  • 当希望在不改变算法结构的前提下,允许子类定制某些步骤时

常见应用:

  • 框架中的生命周期方法(如Servlet的init()service()destroy()
  • 工具类中的算法模板(如排序算法的骨架,具体比较逻辑由子类实现)
  • 测试框架中的测试用例模板(固定测试流程,具体测试步骤由子类实现)

模板方法模式与策略模式的区别:模板方法通过继承实现算法步骤的定制,强调"继承式扩展";策略模式通过组合实现算法的替换,强调"组合式扩展"。

http://www.dtcms.com/a/466472.html

相关文章:

  • 【xx】PCIe协议之Margning篇之 Pipe Spec 之 典型 magining sequence
  • 4、docker 容器
  • 全面解析java注解
  • 多模态大模型研究国庆简报【2025-10-1~2025-10-10】
  • promise的用法
  • 13年测试经验,性能测试-性能调优分析汇总,一篇汇总...
  • 网站开发组合 所有组合网站建设负责人证明
  • BFS解决最短路径问题
  • DNS 隐私防护与用户画像防范策略
  • 免费的x网站域名上海十大工业设计公司
  • 如何在Android Studio中使用Gemini进行AI Coding
  • 学校网站建设材料惠州抖音推广
  • DIN70121协议解读
  • 网站优化软件常用python编程软件
  • 软件的设计原理
  • petri网学习笔记——(五)第二章 petri网的动态性质
  • 长兴网站制作公司wordpress tag优化
  • Spring Bean 生命周期详解:初始化与销毁方式对比与实践
  • 做交易网站什么开发语言网络工程师
  • DeviceNet 转 Modbus TCP 协议转换在 S7-1200 PLC化工反应釜中的应用
  • 网站建设公司网络服务学美工难吗
  • S29-昆仑触屏串口批量写应用
  • C# 委托(Delegate)
  • 企业单位网站建设内容需要什么saas电商建站系统
  • 【63】OpenCV C++实战篇——用C++实现的直线卡尺工具--自选找线方向(从左到右、从右到左、从上到下、从下到上)
  • 做网站你们用什么浏览器如何免费建立个人网站
  • 《金钱心理学》读后感
  • 临沂网站设计建设wordpress 下拉菜单设置
  • PyTorch Transformers| Azure
  • 2.c++面向对象(二)