模板方法模式通过抽象基类定义算法骨架,子类实现具体步骤。其核心构成包括:抽象基类、模板方法(固定流程)、基本操作(纯虚函数,子类实现)、钩子方法(可选覆盖)和具体子类。该模式提升代码复用性,因公共流程集中于基类;增强可维护性,遵循“好莱坞原则”,子类无需调用基类,仅扩展特定行为,结构清晰,扩展灵活。

C++的模板方法模式,在我看来,就是一种巧妙的算法骨架设计。它允许你在一个基类中定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。核心目的是在不改变算法结构的前提下,让子类可以重新定义算法的某些特定步骤,从而实现代码的有效复用。这不仅仅是一种设计模式,更是一种思维方式,引导我们如何优雅地处理变与不变。
要实现模板方法模式,我们通常会创建一个抽象基类,其中包含一个非虚的“模板方法”——这就是算法的骨架。这个模板方法会调用一系列虚函数(或纯虚函数),这些虚函数就是算法中可以被子类定制的“基本操作”。子类通过重写这些虚函数来提供自己的特定实现。
举个例子,假设我们要构建不同型号的汽车。虽然每种车的具体部件和组装方式可能不同,但整体的“造车流程”是相似的:设计、制造车身、安装引擎、喷漆、测试。
#include <iostream>
#include <string>
#include <vector>
// 抽象基类:定义造车流程的骨架
class CarBuilder {
public:
// 模板方法:定义了造车的固定流程,不可被子类重写
void buildCar() {
designCar();
manufactureBody();
installEngine();
paintCar();
testCar();
// 这是一个钩子方法,子类可以选择性实现
if (addOptionalFeatures()) {
std::cout << "Adding optional features specific to " << getCarModel() << std::endl;
}
std::cout << getCarModel() << " car built successfully!\n" << std::endl;
}
// 纯虚函数:必须由子类实现的基本操作
virtual void designCar() = 0;
virtual void manufactureBody() = 0;
virtual void installEngine() = 0;
virtual void paintCar() = 0;
virtual void testCar() = 0;
// 钩子方法:有默认实现,子类可以选择性覆盖
virtual bool addOptionalFeatures() {
return false; // 默认不添加额外功能
}
// 辅助方法,用于获取模型名称
virtual std::string getCarModel() const = 0;
virtual ~CarBuilder() = default;
};
// 具体子类:实现轿车建造流程
class SedanCarBuilder : public CarBuilder {
public:
void designCar() override {
std::cout << "Designing a sleek Sedan model." << std::endl;
}
void manufactureBody() override {
std::cout << "Manufacturing Sedan body with lightweight materials." << std::endl;
}
void installEngine() override {
std::cout << "Installing a 1.5L turbocharged engine for Sedan." << std::endl;
}
void paintCar() override {
std::cout << "Painting Sedan in metallic silver." << std::endl;
}
void testCar() override {
std::cout << "Performing urban driving tests for Sedan." << std::endl;
}
bool addOptionalFeatures() override {
std::cout << "Adding heated seats and panoramic sunroof for Sedan." << std::endl;
return true; // 轿车默认添加额外功能
}
std::string getCarModel() const override {
return "Sedan";
}
};
// 具体子类:实现SUV建造流程
class SUVCarBuilder : public CarBuilder {
public:
void designCar() override {
std::cout << "Designing a robust SUV model with high ground clearance." << std::endl;
}
void manufactureBody() override {
std::cout << "Manufacturing SUV body with reinforced steel frame." << std::endl;
}
void installEngine() override {
std::cout << "Installing a 2.0L powerful engine for SUV." << std::endl;
}
void paintCar() override {
std::cout << "Painting SUV in matte black." << std::endl;
}
void testCar() override {
std::cout << "Performing off-road and safety tests for SUV." << std::endl;
}
std::string getCarModel() const override {
return "SUV";
}
// SUV不添加可选功能,使用默认实现(即不覆盖addOptionalFeatures)
};
/*
// 示例用法
int main() {
std::cout << "--- Building a Sedan ---" << std::endl;
CarBuilder* sedanBuilder = new SedanCarBuilder();
sedanBuilder->buildCar();
std::cout << "--- Building an SUV ---" << std::endl;
CarBuilder* suvBuilder = new SUVCarBuilder();
suvBuilder->buildCar();
delete sedanBuilder;
delete suvBuilder;
return 0;
}
*/在这个例子中,
CarBuilder
buildCar
designCar
manufactureBody
SedanCarBuilder
SUVCarBuilder
addOptionalFeatures
SedanCarBuilder
立即学习“C++免费学习笔记(深入)”;
这个模式的核心,在我看来,可以拆解为几个关键角色,它们协同工作,共同构建出那个“不变的骨架,可变的细节”的哲学。
是那个抽象基类 (Abstract Base Class)。它是整个模式的灵魂,定义了算法的整体结构,也就是我们常说的“骨架”。这个基类会包含:
Gyb2b V1.01免费版可终身使用,是一款功能强大的B2B电子商务应用软件。该软件不仅更新和修改了V1.0相关功能,更是采用了目前互联网上最流行的LAMP组合(Linux+Apache+Mysql+PHP)开发完成,模板技术实现了界面与代码的有效分离,用户可以快速地在此基础上编译模板;提供B2B电子商务应用最常见的求购、供应、商品、公司库、行业资讯、商圈、资信认证、在线交易、交易评分、留言、搜
0
= 0
我个人觉得,理解这些构成要素之间的关系至关重要。模板方法像是一个指挥家,协调着各个基本操作的执行顺序,而子类则是具体的演奏者,负责演绎出不同的乐章。钩子方法则像是在乐章中留下的即兴发挥空间,让演奏者可以根据需要加入自己的特色。
谈到代码复用和可维护性,模板方法模式无疑是C++设计中一个强有力的工具。我曾经在处理一些业务流程相似但具体实现有差异的模块时,深感其妙用。
它提升复用性的核心在于将公共逻辑上移到基类。那些在不同子类中重复出现的、固定的算法步骤,被抽象并封装在基类的模板方法中。这意味着你不需要在每个子类中都重新编写这部分代码。比如我们造车的例子,
buildCar
至于可维护性,它主要体现在“好莱坞原则”(Hollywood Principle)的实践上:“Don't call us, we'll call you.”(别打电话给我们,我们会打电话给你)。基类定义了算法的骨架,它在适当的时候调用子类实现的基本操作。这意味着子类不需要知道基类的具体实现细节,它只需要关心如何实现自己的那部分逻辑。这种松耦合的设计使得系统更容易理解和修改。当需求变化时,通常只需要修改或添加新的子类,而无需触碰基类,从而降低了引入bug的风险。
想象一下,如果有一天我们需要引入一个新的汽车型号,比如电动车。我们只需要创建一个
ElectricCarBuilder
designCar
installEngine
buildCar
以上就是C++模板方法模式与代码复用实现的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号