设计模式之模板方法模式
2023-09-11 14:22:29 时间
1. 概述
模板方法模式
定义一个操作中的算法的框架,而降这些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模式中基类和子类的角色
(1)抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
(2)具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。
优点
(2)模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。
(2)子类实现算法的某些细节,有助于算法的扩展。
(3)通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。
定义一个操作中的算法的框架,而降这些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模式中基类和子类的角色
(1)抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
(2)具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。
优点
(2)模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。
(2)子类实现算法的某些细节,有助于算法的扩展。
(3)通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。
缺点
(1)每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。
适用场景
(2)在某些类的算法中,用了相同的方法,造成代码的重复。
(2)控制子类扩展,子类必须遵守算法规则。
模板方法类图
2. 编程模板
#pragma once
#include <iostream>
#include <string>
using std::cout;
using std::endl;
//共有方法基类,给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类中实现
class BaseTemplate
{
public:
BaseTemplate(){}
~BaseTemplate(){}
public:
virtual void TempMethod1()=0; //定义两个子类都会有的模板方法,子类进行个性化配置
virtual void TempMethod2()=0;
public:
//模板方法,提供了框架,推迟到子类中去实现
void TempOperate()
{
this->TempMethod1();
this->TempMethod2();
cout << "base class function;" << endl;
} //内联形式函数
};
//继承的派生类1
class ConcreteClassA: public BaseTemplate
{
public:
ConcreteClassA(){}
~ConcreteClassA(){}
public:
void TempMethod1() override
{
cout << "ConcreteClassA TempMethod1;" << endl;
}
void TempMethod2() override
{
cout << "ConcreteClassA TempMethod2;" << endl;
}
};
//继承的派生类2
class ConcreteClassB: public BaseTemplate
{
public:
ConcreteClassB(){}
~ConcreteClassB(){}
public:
void TempMethod1() override
{
cout << "ConcreteClassB TempMethod1;" << endl;
}
void TempMethod2() override
{
cout << "ConcreteClassB TempMethod2;" << endl;
}
};
int main(void)
{
BaseTemplate* tempclass = nullptr;
tempclass = new ConcreteClassA();
tempclass->TempOperate();
tempclass = new ConcreteClassB();
tempclass->TempOperate();
delete tempclass;
tempclass = nullptr;
return 0;
}
3. 运行结果
相关文章
- 字典树(模板)
- 设计模式——模板方法
- laravel5.1框架基础之Blade模板继承简单使用方法分析
- ArcGIS 服务对象扩展(SOE)新手自学笔记(3):REST SOE模板下
- 第三百一十节,Django框架,模板语言
- 简介Python设计模式中的代理模式与模板方法模式编程
- C#设计模式——模板方法(Template Method)
- intellij idea:设置java方法注释模板(intellij idea 2019.2)
- ThinkPHP使用smarty模板引擎的方法
- c++模板学习05之类模板
- Atitit 模板引擎总结 目录 1. 模板引擎1 2. 常见模板步骤1 2.1. 1)定义模板字符串 1 2.2. 2)预编译模板 2 2.3. 渲染模板 2 3. 流程渲染 if el
- 设计模式 - 模板方法模式(template method pattern) 具体解释
- 设计模式-模板方法模式Template Method
- 004-行为型-02-模板方法模式(Template Method)
- Flask的jinja2模板中自定义过滤器的使用
- Spring Boot整合Thymeleaf和FreeMarker模板