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

香水网站设计网页怎么查公司联系方式

香水网站设计网页,怎么查公司联系方式,建设银行网站是多少,做网站工作辛苦吗目录 前言 一、模板方法模式的核心思想 二、模板方法模式的结构组成 1. 抽象类(Abstract Class) 2. 具体子类(Concrete Class) 三、C 实现示例:咖啡与茶的制作流程 步骤 1:定义抽象类(饮料…

目录

前言

一、模板方法模式的核心思想

二、模板方法模式的结构组成

1. 抽象类(Abstract Class)

2. 具体子类(Concrete Class)

三、C++ 实现示例:咖啡与茶的制作流程

步骤 1:定义抽象类(饮料基类)

步骤 2:实现具体子类(咖啡和茶)

步骤 3:测试代码

四、模板方法模式的优缺点(C++ 视角)

优点

缺点

五、C++ 中模板方法模式的应用场景

六、C++ 中模板方法模式的注意事项

七、总结


前言

在面向对象设计中,我们经常会遇到这样的场景:多个类实现相似的流程,但部分步骤存在差异。如果为每个类重复编写相同的流程代码,不仅会导致冗余,还会增加维护成本。模板方法模式正是为解决这类问题而生的 —— 它通过定义统一的流程骨架,将可变步骤延迟到子类实现,完美平衡了流程标准化细节差异化

本文将结合 C++ 代码,深入解析模板方法模式的原理、实现与应用。

一、模板方法模式的核心思想

模板方法模式是一种经典的行为型设计模式,其核心可以概括为:“定义算法骨架,延迟具体实现”

想象一个场景:制作咖啡和茶的流程高度相似(煮水→冲泡→装杯→加调料),但 “冲泡” 和 “加调料” 的具体操作不同。模板方法模式会将这些相同的流程步骤抽象到父类,而将不同的步骤声明为抽象方法,由子类(咖啡、茶)各自实现。

用 C++ 的视角来看,这种模式通过抽象类 + 继承实现:

  • 抽象类负责定义 “流程骨架”(模板方法);
  • 子类负责实现 “可变细节”(抽象方法)。

二、模板方法模式的结构组成

模板方法模式主要包含两个角色,在 C++ 中通常通过类层次结构实现:

1. 抽象类(Abstract Class)

  • 模板方法(Template Method):一个非虚成员函数(通常用final修饰,防止子类重写),定义算法的步骤顺序,调用其他方法(包括抽象方法和具体方法)。
  • 抽象方法(Primitive Operations):纯虚函数,由子类实现的可变步骤。
  • 具体方法(Concrete Methods):普通成员函数,算法中固定不变的步骤(子类无需修改)。
  • 钩子方法(Hook Methods):虚函数(有默认实现),子类可选择性重写,用于控制模板流程的分支(可选)。

2. 具体子类(Concrete Class)

  • 继承抽象类,实现所有纯虚的抽象方法;
  • 可选重写钩子方法,调整流程的执行逻辑。

三、C++ 实现示例:咖啡与茶的制作流程

下面我们用 C++ 实现一个经典案例:咖啡和茶的制作。两者的流程相似,但 “冲泡” 和 “加调料” 的步骤不同,适合用模板方法模式封装。

步骤 1:定义抽象类(饮料基类)

首先创建抽象类Beverage,它包含制作饮料的流程骨架和相关方法:

// Beverage.h
#ifndef BEVERAGE_H
#define BEVERAGE_H#include <iostream>
using namespace std;class Beverage {
public:// 模板方法:定义制作流程的骨架,用final防止子类修改(C++11及以上支持)void prepareRecipe() final {boilWater();       // 固定步骤:煮水brew();            // 抽象方法:冲泡(子类实现)pourInCup();       // 固定步骤:倒入杯子addCondiments();   // 抽象方法:加调料(子类实现)if (customerWantsCondiments()) {  // 钩子方法:判断是否加额外调料addExtraCondiments();         // 可选步骤:加额外调料}}protected:// 抽象方法:冲泡(纯虚函数,子类必须实现)virtual void brew() = 0;// 抽象方法:加调料(纯虚函数,子类必须实现)virtual void addCondiments() = 0;// 钩子方法:默认返回true(加额外调料),子类可重写virtual bool customerWantsCondiments() {return true;}private:// 具体方法:固定步骤——煮水(子类无需修改)void boilWater() {cout << "煮水至沸腾" << endl;}// 具体方法:固定步骤——倒入杯子(子类无需修改)void pourInCup() {cout << "倒入杯中" << endl;}// 具体方法:可选步骤——加额外调料(固定逻辑)void addExtraCondiments() {cout << "添加额外糖/奶" << endl;}
};#endif // BEVERAGE_H

代码说明

  • prepareRecipe()是模板方法,用final确保子类无法修改流程顺序;
  • brew()addCondiments()是纯虚函数(抽象方法),必须由子类实现;
  • customerWantsCondiments()是钩子方法,提供默认实现,子类可重写以改变流程分支;
  • boilWater()pourInCup()等是具体方法,封装固定步骤,子类无需关心。

步骤 2:实现具体子类(咖啡和茶)

接下来创建CoffeeTea类,继承Beverage并实现抽象方法:

Coffee

// Coffee.h
#ifndef COFFEE_H
#define COFFEE_H#include "Beverage.h"class Coffee : public Beverage {
protected:// 实现抽象方法:咖啡的冲泡逻辑void brew() override {cout << "用沸水冲泡咖啡粉" << endl;}// 实现抽象方法:咖啡的加调料逻辑void addCondiments() override {cout << "加牛奶和糖" << endl;}// 重写钩子方法:咖啡默认不加额外调料bool customerWantsCondiments() override {return false; // 不执行addExtraCondiments()}
};#endif // COFFEE_H

Tea

// Tea.h
#ifndef TEA_H
#define TEA_H#include "Beverage.h"class Tea : public Beverage {
protected:// 实现抽象方法:茶的冲泡逻辑void brew() override {cout << "用沸水浸泡茶叶" << endl;}// 实现抽象方法:茶的加调料逻辑void addCondiments() override {cout << "加柠檬" << endl;}// 不重写钩子方法,使用父类默认逻辑(加额外调料)
};#endif // TEA_H

代码说明

  • CoffeeTea分别实现了brew()addCondiments(),定义各自的差异化步骤;
  • Coffee重写了钩子方法customerWantsCondiments(),返回false以跳过 “加额外调料” 步骤;
  • Tea未重写钩子方法,使用父类默认实现(返回true),因此会执行 “加额外调料”。

步骤 3:测试代码

最后编写测试代码,验证模板方法的执行效果:

// main.cpp
#include "Coffee.h"
#include "Tea.h"int main() {// 制作咖啡Beverage* coffee = new Coffee();cout << "制作咖啡:" << endl;coffee->prepareRecipe();// 制作茶Beverage* tea = new Tea();cout << "\n制作茶:" << endl;tea->prepareRecipe();// 释放资源delete coffee;delete tea;return 0;
}

输出结果

制作咖啡:
煮水至沸腾
用沸水冲泡咖啡粉
倒入杯中
加牛奶和糖制作茶:
煮水至沸腾
用沸水浸泡茶叶
倒入杯中
加柠檬
添加额外糖/奶

结果分析

  • 咖啡和茶都遵循了prepareRecipe()定义的流程骨架;
  • 差异化步骤(brew()addCondiments())按子类实现执行;
  • 钩子方法控制了流程分支:咖啡跳过 “加额外调料”,茶则执行了该步骤。

四、模板方法模式的优缺点(C++ 视角)

优点

  1. 代码复用:将公共流程(如boilWater())抽取到抽象类,减少重复代码;
  2. 符合开闭原则:新增饮料(如奶茶)只需继承Beverage并实现抽象方法,无需修改父类;
  3. 流程可控:父类通过final修饰模板方法,避免子类破坏流程逻辑;
  4. 逻辑清晰:算法的核心步骤在父类中集中体现,便于维护。

缺点

  1. 类数量膨胀:每增加一个具体实现就需要一个子类,可能导致类数量过多;
  2. 继承局限性:C++ 不支持多继承,子类若需复用多个模板流程会受限制;
  3. 耦合性:子类与父类的依赖较强,父类的修改可能影响所有子类。

五、C++ 中模板方法模式的应用场景

  1. 框架设计
    C++ 框架常通过模板方法模式定义核心流程,让用户通过子类定制细节。例如:

    • MFC 框架的Run()方法:定义了消息循环的骨架,用户重写OnDraw()等方法处理具体消息;
    • 测试框架(如 Google Test):Test类定义了测试用例的执行流程,用户实现SetUp()TearDown()定制前后置操作。
  2. 业务流程标准化
    当多个业务场景共享相似流程但细节不同时,例如:

    • 支付流程(创建订单→验证→扣款→回调):不同支付方式(微信 / 支付宝)的 “扣款” 步骤不同;
    • 数据处理流程(读取→解析→过滤→存储):不同数据格式(JSON/XML)的 “解析” 步骤不同。
  3. 钩子方法的灵活使用
    需要根据子类特性动态调整流程时,例如:

    • 日志框架:通过钩子方法控制是否输出调试日志;
    • 游戏 AI:通过钩子方法决定角色在特定条件下的行为分支。

六、C++ 中模板方法模式的注意事项

  1. 模板方法用final修饰
    C++11 及以上支持final关键字,修饰模板方法可防止子类意外修改流程顺序,例如:

    void prepareRecipe() final { ... } // 禁止子类重写
    
  2. 抽象方法与钩子方法的区分

    • 必须实现的步骤用纯虚函数virtual void func() = 0);
    • 可选重写的步骤用虚函数(提供默认实现),即钩子方法。
  3. 避免过度设计
    若流程差异较小,不必强行使用模板方法模式,否则可能增加代码复杂度。

七、总结

模板方法模式是 C++ 中实现 “流程复用 + 细节定制” 的经典模式,它通过抽象类定义算法骨架,用子类填充可变细节,既保证了流程的一致性,又保留了灵活性。

在 C++ 开发中,合理使用模板方法模式可以显著减少重复代码,提高系统的可维护性。但需注意平衡继承带来的耦合性,必要时可结合策略模式(通过组合实现)弥补继承的局限性。

掌握模板方法模式,不仅能写出更优雅的 C++ 代码,更能理解许多 C++ 框架的设计思想 ——“骨架由框架定,细节由开发者填”

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

相关文章:

  • 图表设计网站漳州 网站建设公司哪家好
  • 为网站网站做宣传网页设计发展前景分析
  • 网站制作公司哪儿济南兴田德润有活动吗网络推广这个工作怎么样
  • 化妆品企业网站建设的缺点电子商务专业毕业从事什么工作
  • 莱芜正规的网站建设做网站协议怎么签
  • 企业网站开发制作免费制作小程序软件
  • 开办网站备案帮卖货平台
  • 企业网站建设方案精英百度网站怎样做
  • 如何建设免费网站视频wordpress模板 众筹
  • 有哪些做品牌特卖的网站重庆有哪些网站
  • 电子商务网站建设前的分析pageadmin建站系统破解版
  • 北京网站建设推广服linux php网站部署
  • 苏州网站建设制作公司网站建设预算策划
  • 网站建设主持词ps在线图片编辑
  • 企业网站建设教程视频易语言 wordpress登录注册
  • 海南省建设考试网站成品网站包含后台么
  • php网站 更改logo唐山网站专业制作
  • Flutter版本管理工具FVM
  • 网站开发购物店12345汽车网址大全
  • 中山市 做网站运营一个企业网站的推广方案
  • 空包网站建设属于哪类wordpress调用函数大全
  • 网站做视频的软件叫什么wrix 网站开发
  • 网站一键制作整改网站建设情况
  • 做网站推销产品效果怎么样直播间网站建设
  • 单页网站订单系统怎么改邮箱wordpress怎么添加留言板
  • 个人博客网站的建设结构图如何推广企业官方网站内容
  • 微博营销网站二级建造师报考条件2021考试时间
  • reason: unable to verify the first certificate 如何处理
  • 建设公司网站需要什么销售app哪个好用
  • 品牌网站策划描述网站开发的流程