C++设计模式学习(二)

news/2024/12/4 6:52:40/

模板方法

GOF-23模式分类

在这里插入图片描述

从目的来看:
  • 创建型(Creational)模式:将对象的部分创建工作延迟到子类或者其他对象,从而应对需求变化为对象创建时具体类型实现引来的冲击。
  • 结构型(Structural)模式:通过类继承或者对象组合获得更灵活的结构,从而应对需求变化为对象的结构带来的冲击。
  • 行为型(Behavioral)模式:通过类继承或者对象组合来划分类与对象间的职责,从而应对需求变化为多个交互的对象带来
    的冲击。
从范围来看:
  • 类模式处理类与子类的静态关系。
  • 对象模式处理对象间的动态关系。

在这里插入图片描述

重构获得模式

面向对象设计模式是“好的面向对象设计”,所谓“好的面向对象设计”指是那些可以满足 “应对变化,提高复用”的设计 。

现代软件设计的特征是“需求的频繁变化”。设计模式的要点是“寻找变化点,然后在变化点处应用设计模式,从而来更好地应对需求的变化”.“什么时候、什么地点应用设计模式”比“理解设计模式结构本身”更为重要。

设计模式的应用不宜先入为主,一上来就使用设计模式是对设计模式的最大误用。没有一步到位的设计模式。敏捷软件开发实践提倡的“Refactoring to Patterns”是目前普遍公认的最好的使用设计模式的方法。

一般来说都要使用重构的方法进行完善。

重构关键技法
  • 静态 -> 动态

  • 早绑定 -> 晚绑定

  • 继承 -> 组合

  • 编译时依赖 -> 运行时依赖

  • 紧耦合 -> 松耦合

组件协作”模式

  • 现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。
  • 典型模式
    • Template Method(模板方法)
    • Observer / Event(观察者方法)
    • Strategy(策略模式)

Template Method 模式

动机
  • 在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。

  • 如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?

举例

在这里插入图片描述

Library与Application是早绑定的
在这里插入图片描述

Library与Application是晚绑定的

模式定义

定义一个操作中的算法的骨架 (稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override 重写)该算法的某些特定步骤。

相对稳定的算法骨架是使用 Template Method 模式的前提。

如果算法是完全稳定的或者是完全变化的那么都不能使用设计模式。因为设计模式是在算法的稳定中间设置隔离点去分离出来,将变化限制在一个范围之内。

结构

在这里插入图片描述

要点
  • Template Method模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用。它用最简洁的机制(虚函数的多态性)为很多应用程序框架提供了灵活的扩展点,是代码复用方面的基本实现结构。

  • 除了可以灵活应对子步骤的变化外,“不要调用我,让我来调用你”的反向控制结构是 Template Method 的典型应用。

  • 在具体实现方面,被 Template Method调用的虚方法可以具有实现,也可以没有任何实现(抽象方法、纯虚方法),但一般推荐将它们设置为protected方法。

c语言也可以利用函数指针实现晚绑定。

策略模式

动机

在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。

模式定义

定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化)。

结构

在这里插入图片描述

Strategy及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。

代码层面的复制粘贴不是真正的复用,真正的复用是二进制层面的复用。子类化的方式取拓展程序。

只要是代码中存在if或者switch且可能拓展的情况都可以使用策略模式。代码层面的复制粘贴(if else)会产生额外的性能负担。如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省对象开销。

高层不能依赖低层模块,实现细节依赖抽象,抽象不能依赖实现细节


http://www.ppmy.cn/news/87443.html

相关文章

2023电工杯数学建模B题思路模型代码

占个位置吧,开始在本帖实时更新电工杯数学建模赛题思路代码,文章末尾获取! B题思路分析 B题就是一个评价类的题目,整体难度就远低于A题了,这个题目主要是评估人工智能对大学生学习的影响。我们需要先对提供的数据进行…

PyTorch-Forecasting一个新的时间序列预测库

时间序列预测在金融、天气预报、销售预测和需求预测等各个领域发挥着至关重要的作用。PyTorch- forecasting是一个建立在PyTorch之上的开源Python包,专门用于简化和增强时间序列的工作。在本文中我们介绍PyTorch-Forecasting的特性和功能,并进行示例代码…

2023电工杯数学建模A题B题

占个位置吧,开始在本帖实时更新电工杯数学建模赛题思路代码,文章末尾获取! A题思路分析 问题一:1典型住户电采暖负荷用电行为分析 (1)在满足温控区间约束条件下,分析典型房间温变过程微分方程…

凌恩生物文献分享 | 癌症领域新曙光——肿瘤内微生物

上一期我们给大家介绍了肿瘤胞内菌在癌症转移中发挥的作用。2022年12月,蔡尚老师团队在Cell子刊-Trends in Cell Biology上又发表了一篇总结肿瘤内菌群在癌症转移中最新发现的综述,其中讨论了癌症治疗遇到的新挑战。 研究亮点 1)癌症转移是…

MyBatis环境搭建配置、增删改查操作、分页、事务操作、动态SQL、缓存机制、注解开发

MyBatis 文章目录 MyBatisXML语言简介用途各部分注解声明元素属性注释CDATA转义字符 搭建环境读取实体类创建实体与映射关系的文件 配置MyBatis创建工具类接口实现 Mybatis工作流程增删改查指定映射规则指定构造方法字段名称带下划线处理条件查询插入数据复杂查询和事务一对多查…

JavaWeb《后端内容:5. 项目实战:书城系统(下篇)》

目录 1. Cookie了解 Cookie在浏览器和服务器之间的传递 1. 创建Cookie对象 在客户端保存Cookie 2. 设置Cookie的有效时长 3. Cookie的应用 2. kaptcha 3. 注册功能实装 3.1 注册的初步实现 3.2 正则表达式了解 3.3 注册页面的表单验证 3.4 判断用户名是否已经被注册…

springboot国际化多语言配置

文章目录 概要springboot项目为例1 新建路径/文件2 新建两个配置类 搞一个控制器测试总结 概要 项目中有时候会用到多语言的业务场景; 一般来说都是通过后端实现的,将先有内容替换为适用的环境语言; springboot项目为例 1 新建路径/文件 新建路径static/i18n新建文件: mess…

Cadence+SPB16.2入门教程(上)

第1章焊盘制作 1.1用Pad Designer制作焊盘 Allegro中制作焊盘的工作叫Pad Designer,所有SMD焊盘、通孔焊盘以及过孔都用该工具来制作。 打开程序->Cadence SPB 16.2->PCB Editer utilities->Pad Designer,弹出焊盘制作的界面,如图1.1所示。 在Units下拉框中选择…