培训行业seo整站优化,网页设计地址,企业免费自助建站平台,大学生创意产品设计核心思想
模板方法设计模式是一种行为设计模式#xff0c;它定义了一个算法的框架#xff0c;并将某些步骤的具体实现延迟到子类中。通过这种方式#xff0c;模板方法模式允许子类在不改变算法结构的情况下重新定义算法的某些步骤。
模板方法模式的核心在于#xff1a; …核心思想
模板方法设计模式是一种行为设计模式它定义了一个算法的框架并将某些步骤的具体实现延迟到子类中。通过这种方式模板方法模式允许子类在不改变算法结构的情况下重新定义算法的某些步骤。
模板方法模式的核心在于 1、定义一个算法的骨架在父类中定义一个模板方法该方法包含算法的步骤。 2、延迟实现将某些步骤的具体实现交给子类来完成。
使用场景
固定流程可变实现当算法的整体流程是固定的但某些步骤的具体实现可能不同时。 代码复用当多个类有相似的算法结构但某些步骤的实现不同时可以通过模板方法模式避免代码重复。 框架设计在框架设计中模板方法模式常用于定义框架的核心流程同时允许用户自定义某些步骤。
优点
代码复用将公共的算法逻辑放在父类中避免重复代码。 扩展性子类可以灵活地重写某些步骤而不影响算法的整体结构。 控制流程父类控制算法的流程子类只负责实现细节。
缺点
灵活性受限由于算法的流程是固定的子类只能改变某些步骤的实现不能改变整体流程。 继承的缺点模板方法模式依赖于继承如果子类过多可能会导致类层次结构复杂。
示例代码
#include iostream
#include string// 抽象基类定义模板方法
class DocumentProcessor {
public:// 模板方法定义算法的骨架void processDocument() {openDocument();readDocument();if (needAnalyze()) {analyzeDocument();}saveDocument();closeDocument();}virtual ~DocumentProcessor() default;protected:// 具体步骤的默认实现virtual void openDocument() {std::cout Opening document... std::endl;}virtual void readDocument() {std::cout Reading document... std::endl;}virtual void analyzeDocument() {std::cout Analyzing document... std::endl;}virtual void saveDocument() {std::cout Saving document... std::endl;}virtual void closeDocument() {std::cout Closing document... std::endl;}// 钩子方法子类可以重写以改变算法的行为virtual bool needAnalyze() {return true;}
};// 具体子类实现特定类型的文档处理
class PDFProcessor : public DocumentProcessor {
protected:void openDocument() override {std::cout Opening PDF document... std::endl;}void saveDocument() override {std::cout Saving PDF document... std::endl;}bool needAnalyze() override {return false; // PDF 文档不需要分析}
};// 具体子类实现另一种类型的文档处理
class WordProcessor : public DocumentProcessor {
protected:void openDocument() override {std::cout Opening Word document... std::endl;}void analyzeDocument() override {std::cout Analyzing Word document for spelling errors... std::endl;}void saveDocument() override {std::cout Saving Word document... std::endl;}
};int main() {// 处理 PDF 文档DocumentProcessor* pdfProcessor new PDFProcessor();pdfProcessor-processDocument();delete pdfProcessor;std::cout ------------------------ std::endl;// 处理 Word 文档DocumentProcessor* wordProcessor new WordProcessor();wordProcessor-processDocument();delete wordProcessor;return 0;
}输出结果
Opening PDF document...
Reading document...
Saving PDF document...
Closing document...
------------------------
Opening Word document...
Reading document...
Analyzing Word document for spelling errors...
Saving Word document...
Closing document...代码解析
DocumentProcessor 类 定义了模板方法 processDocument()它包含了文档处理的固定流程。 提供了默认的步骤实现如 openDocument()、readDocument() 等。 提供了一个钩子方法 needAnalyze()子类可以重写以改变算法的行为。 PDFProcessor 和 WordProcessor 类 继承自 DocumentProcessor重写了某些步骤的具体实现。 PDFProcessor 禁用了分析步骤而 WordProcessor 提供了特定的分析逻辑。 main 函数 分别使用 PDFProcessor 和 WordProcessor 处理文档展示了模板方法模式的灵活性。