C++设计模式-模板方法模式 转载 设计模式 2021年12月15日 15:19 夏至未至 947 当前内容 3086 字,在路上,马上到,马上到 ### 模式介绍 #### 模式意图 模板方法模式(Template Method Pattern): 定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 #### 解决问题 解决复用和扩展两个问题 #### 实现概述 模板方法模式是一种基于继承的代码复用技术 #### 应用场景 - 提取算法的框架流程定义在基类中,将可变的行为留给子类来实现 - 提取公共行为并集中到一个公共父类以避免代码重复; - 通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制 #### 模式特点 ##### 优点 1. 在基类中定义算法的框架,并声明一些流程方法,由具体派生类实现细节,派生类中的实现并不会影响基类定义的算法的框架流程; 2. 基类中的公共行为,有利于代码复用; 3. 派生类可以覆盖基类的方法,重新实现某些方法,具有灵活性; 4. 可以很方便的扩展和更换派生类而不影响基类和其他派生类,符合开闭原则和单一职责原则。 ##### 缺点 模板方法模式要为每一个不同的基本方法提供一个派生类,如果这种基本方法很多,采用模版模式就会导致类的个数很多,系统更加庞大。 ### 模式结构 - AbstractClass(抽象类):定义或声明了一系列基本操作method,这些操作可以是具体也可以是抽象的,每一个操作都对应算法的一个步骤,在其派生类(子类)中可以重定义。抽象类中定义一个用于定义一个算法的流程框架的方法。 - ConcreteClass(派生类):抽象类的子类,用于实现在父类中声明的抽象基本操作以完成子类特定算法的步骤,也可以覆盖在父类中已经实现的具体基本操作。 ### 代码示例 模拟网购,不管是在哪个平台其流程大体为:选商品->加购物车->付款 - AbstractClass(抽象类):OnlineMall - ConcreteClass(派生类): TaoBao 、JingDong AbstractClass(抽象类) /// AbstractClass(抽象类):OnlineMall class OnlineMall { public: virtual ~OnlineMall() = default; // 算法的流程框架 void shopping(){ /// 流程大体为:选商品->加购物车->付款 selectProduct(); addShoppingCart(); payment(); } protected: virtual void selectProduct() = 0; /// 选商品 virtual void addShoppingCart() = 0; /// 加购物车 virtual void payment() = 0; /// 付款 OnlineMall() = default; }; ConcreteClass(派生类) /// ConcreteClass(派生类): TaoBao 、JingDong class TaoBao : public OnlineMall{ public: TaoBao() { std::cout << "TaoBao Hello" << std::endl; } ~TaoBao() override { std::cout << "TaoBao Bye" << std::endl; } private: void selectProduct() override { std::cout << "在 TaoBao 选商品" << std::endl; } void addShoppingCart() override { std::cout << "将商品加入 TaoBao 购物车" << std::endl; } void payment() override { std::cout << "支付 TaoBao 购物车待付款给" << std::endl; } }; class JingDong : public OnlineMall{ public: JingDong() { std::cout << "JingDong Hello" << std::endl; } ~JingDong() override { std::cout << "JingDong Bye" << std::endl; } private: void selectProduct() override { std::cout << "在 JingDong 选商品" << std::endl; } void addShoppingCart() override { std::cout << "将商品加入 JingDong 购物车" << std::endl; } void payment() override { std::cout << "支付 JingDong 购物车待付款给" << std::endl; } }; #### 测试 int main() { OnlineMall* shopTaoBao= new TaoBao(); shopTaoBao->shopping(); delete shopTaoBao; OnlineMall* shopJingDong = new JingDong(); shopJingDong->shopping(); delete shopJingDong; return 0; } > 原文链接:https://blog.csdn.net/leacock1991/article/details/112548367 本文标题: C++设计模式-模板方法模式 本文作者: 夏至未至 发布时间: 2021年12月15日 15:19 最近更新: 2022年2月14日 17:28 原文链接: 许可协议: 署名-非商业性-禁止演绎 4.0 国际(CC BY-NC-ND 4.0) 请按协议转载并保留原文链接及作者 设计模式(25) 上一个 C++设计模式-访问者模式 下一个 C++设计模式-策略模式 当前文章评论暂未开放,请移步至留言处留言。