博客
关于我
设计模式之模板模式
阅读量:358 次
发布时间:2019-03-04

本文共 1597 字,大约阅读时间需要 5 分钟。

模板方法模式(Template Method Pattern)

概念

模板方法模式是一种行为模式,它通过将特定算法中的某些必要步骤委托给抽象方法,并通过子类继承对抽象方法的不同实现来改变整个算法的行为。这种模式的核心思想是将算法的公共部分封装在抽象类中,而具体的实现细节由子类来决定。

应用场景

模板方法模式通常适用于以下情况:

  • 统一操作步骤:系统中存在多个应用场景,但这些场景共享相同的操作步骤。
  • 多样化操作细节:各个子类在实现相同的操作步骤时,可能有不同的细节处理方式。
  • 代码复用:避免重复代码,通过继承和多态来实现不同行为的复用。

总结

模板方法模式的优势在于:

  • 将算法的公共部分集中在抽象类中统一管理。
  • 子类可以通过实现抽象方法来灵活扩展算法的行为。
  • 实现了对有行为变化的对象的解耦,有助于系统的扩展和维护。

角色和职责

  • AbstractClass:提供一个抽象类,包含所有算法的公共步骤。
  • ConcreteClass:继承自抽象类,并实现抽象方法中的具体步骤。
  • templateMethod():抽象方法,定义一个算法的骨架。
  • method1() & method2():具体步骤方法,实现算法的不同部分。

案例

以汽车组装为例,假设我们有一个抽象类MakeCar,其子类MakeBusMakeJeep分别实现不同的组装步骤。

#include 
using namespace std;class MakeCar {public: virtual void makeHead() = 0; virtual void makeBody() = 0; virtual void makeTail() = 0; void make() { makeHead(); makeBody(); makeTail(); }};class MakeBus : public MakeCar {public: void makeHead() { cout << "bus 组装 车头" << endl; } void makeBody() { cout << "bus 组装 车身" << endl; } void makeTail() { cout << "bus 组装 车尾" << endl; }};class MakeJeep : public MakeCar {public: void makeHead() { cout << "Jeep 组装 车头" << endl; } void makeBody() { cout << "Jeep 组装 车身" << endl; } void makeTail() { cout << "Jeep 组装 车尾" << endl; }};int main() { MakeCar *bus = new MakeBus; bus->make(); MakeCar *jeep = new MakeJeep; jeep->make(); delete bus; delete jeep; cout << "hello..." << endl; return 0;}

在这个案例中,MakeCar类定义了一个通用的make()方法,子类MakeBusMakeJeep分别实现了makeHead()makeBody()makeTail()方法。通过模板方法模式,我们可以在不修改MakeCar类的情况下,扩展不同的组装逻辑,从而实现代码的灵活复用和扩展。

转载地址:http://taur.baihongyu.com/

你可能感兴趣的文章
pip 下载慢
查看>>
pip 升级报错AttributeError: ‘NoneType’ object has no attribute ‘bytes’
查看>>
pip 安装opencv-python卡死
查看>>
pip 安装出现异常
查看>>
Pip 安装失败:需要 SSL
查看>>
Pip 安装挂起
查看>>
pip 或 pip3 为 Python 3 安装包?
查看>>
pip 文件损坏导致 pip无法使用 报错 ImportError: cannot import name 'main' from 'pip._int
查看>>
pip 无法从 requirements.txt 安装软件包
查看>>
pip/pip3更换国内源
查看>>
pip3 install PyQt5 --user 失败
查看>>
pip3命令全解析:Python3包管理工具的详细使用指南
查看>>
pip3安装命令重复创建文件‘/tmp/pip-install-xxxxx/package‘失败
查看>>
PIPE 接口信号列表
查看>>
pipeline配置与管理Job企业级实战
查看>>
pipeline项目配置实战
查看>>
Pipenv 与 Conda?
查看>>
QVGA/HVGA/WVGA/FWVGA分辨率屏含义及大小//Android虚拟机分辨率
查看>>
pipreqs : 无法将“pipreqs”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径 正确,然后再试一次。
查看>>
pipy国内镜像的网址
查看>>