设计模式相关知识

embedded/2024/12/22 18:11:58/
  • 核心思想
    • 识别代码中稳定的部分和变化的部分,然后通过抽象、封装等手段,将变化隔离出去,从而达到整体的稳定
  • 六大原则
    • 单一职责
    • 开发封闭
    • 里氏替换原则
    • 接口隔离
    • 依赖倒转
    • 迪米特法则
  • 创建
    • 工厂模式
      • 问题
        • 构造器表现力不足
        • 无法干预创造过程
        • new对象过于依赖具体对象
      • 核心思想:将对象的创建和使用分开
      • 简单工厂模式
        • 静态工厂方法:利用静态方法实现函数抽象
      • 工厂方法模式
        • 配置文件+反射-执行具体创造方法
          • 典型案例:factoryBean
      • 抽象工厂模式
        • 多个抽象方法的工厂方法
    • 建造模式
      • 核心思想:使一个复杂对象的构造和表示分开,相同构造过程可以创建不同表示
    • 原型模式
      • 复制
  • 性能
    • 单例模式
      • 饿汉式
      • 懒汉式
      • 锁-懒汉式
      • 双重检测式-懒汉式
      • 静态内部类
      • 枚举
    • 享元模式
      • 共享
  • 组件协作
    • 模板模式
      • 继承典型,简单来说就是将相同的代码放在父类,有差异变化的抽象到子类实现
    • 策略模式
      • 将算法独立化,代码可随意替换算法
      • 典型:Comparable和Comparator
    • 观察者模式
      • 当一个对象发生变化时,通知依赖于他所有的对象
  • 数据结构
    • 迭代器模式
      • 保护聚合数据内部结构,提供简单方法给外部调用内部数据
      • 经典案例:Iterator和Iterable
        • 为什么不直接实现Iterator?
          • 如果arrayList等直接实现,那么不满足单一职责,具有容器相关的操作及遍历功能
    • 组合模式
      • 将对象的组合模式变成部分-整体,CompositePattern使得用户对单个对象和组合对象的使用具有一致性
    • 责任链模式
      • 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止
      • 实现方式
        • 数组+下标记录
        • 链表方式+每个Filter内部记录着下一个Filter
        • 问题:多个业务都需要操作FilterChain时,会导致Filter下个列表添加到另一个业务的Filter
        • 解决方案:Filter只做过滤,FilterChain做过滤和管理,内部新建一个类,每次添加Filter时,包装到此类,防止其他业务交替使用
      • 不纯的责任链模式:可以将责任推给下一家且可以最终可以没有人接手。
        • 实现方式:函数式接口
  • 单一职责
    • 装饰者模式
      • 不改变原先的类,增强其额外的功能。说白了就是写一个增强类
      • 实现一个接口并且引进一个实现接口的实例
  • 接口隔离
    • 外观模式
      • 将复杂的系统封装成简单的调用,方便外部系统调用
    • 中介者模式
      • 将系统之间多个对象的交互调用集中到一起
    • 代理模式
      • 为其它对象提供一种代理以控制对这个对象的访问
      • 静态代理
        • 通过接口继承的方式,类似装饰者模式
      • 动态代理
        • JDK动态代理
          • 目标接口+Proxy.newProxyInstance
            • 本质:在运行时创建$Proxy0对象增强类,运行时的产物
        • CGLib代理
          • 实现接口MethodInterceptor+Enhancer
    • 适配器模式
      • 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
      • 典型:FutureTask和Runnable,RunnableAdapter
  • 行为变化
    • 命令模式
      • 将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,并支持可撤销的操作。
      • 典型:继承Thread方法实现run方法 ->实现Runnable接口传入Thread类中->从而实现发送者和接收者之间解耦
    • 访问者模式
      • 不改变各元素类的前提下对这些元素进行的新的操作
      • 双分派
        • 静态分派
          • 方法重载
        • 动态分派
          • 方法重写
      • 在不破坏元素内部结构时,通过向元素内部植入接口操作,从而实现此接口,以重载的方式识别不同的元素对其功能进行扩长
  • 状态变化
    • 状态模式
      • 根据对象得内部状态改变其的行为
      • 案例:贩卖机
        • 枚举记录状态 + 贩卖机Machine
        • State接口(进行状态切换)+贩卖机Machine
        • State接口+ 贩卖机Machine控制状态切换
        • State单例模式
    • 备忘录模式
      • 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。
      • 拷贝实现
        • 1.可以直接被修改
        • 2.可以直接new创建快照
      • 使用不同类相同结构记录+只能原始类才能访问创建
        • 同包下权限限制
        • 静态内部类
        • 接口对外开发,实现类同包权限限制
  • 领域问题
    • 解释器模式
      • 给定一个语言,定义它的文法的一种表示,并定义一种解释器,这个解释器使用该表示来解释语言中的句子
  • 其他模式
    • 空指针模式
      • 通过接口实现一个无任何的实现方法,避免null报错
    • 懒加载模式
      • 推迟对象的创建或者某些操作的执行,来一定程度避免资源消耗
      • 实现:函数接口
    • Saga模式
      • Saga是一种分布式事务的模式,它包含一系列事务步骤,这些步骤被设计成可以被单独执行或者回滚。这些事务步骤可以异步执行,它们之间通过一系列的补偿机制(Compensation)来确保系统的一致性。
    • AOP
      • 代码实现

http://www.ppmy.cn/embedded/120184.html

相关文章

【C++ STL】深入理解string类的底层实现

string类的模拟实现 一.string的构造与析构函数1.普通构造函数与析构函数2.拷贝构造的浅拷贝所带来的问题3.如何实现深拷贝 二.运算符重载1.赋值运算符重载2.大小比较相关的运算符重载 三.迭代器的实现四.string常用操作的实现1.静态const成员npos的定义2.插入操作3.查找操作4.…

大模型智能体在金融公告理解领域的应用 | OPENAIGC开发者大赛高校组AI创新之星奖

在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者,希望能带给…

基于php的幸运舞蹈课程工作室管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…

[Uninstall] 软件彻底卸载工具的下载及详细安装使用过程(附有下载文件)

一般软件安装的有问题,或者想重新安装其他版本就需要将原来的版本删除干净,但常常删不干净,本文分享一个软件彻底卸载工具,完成彻底卸载软件的工作 下载链接在文末 下载压缩包后解压 !!安装路径不要有中文…

【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL62

序列发生器 描述 编写一个模块,实现循环输出序列001011。 模块的接口信号图如下: 要求使用Verilog HDL实现,并编写testbench验证模块的功能。 输入描述: clk:时钟信号 rst_n:复位信号,低电平…

Qt_文件操作

目录 1、输入输出类 2、QFile介绍 3、QFile测试 4、QFileInfo介绍 5、QFileInfo测试 结语 前言: 文件操作是程序中的一个重要概念,数据的存储和读取都离不开文件操作。Qt具有强大的跨平台性,因此他提供了跨平台的文件操作能力。Qt中将…

【机器学习-无监督学习】聚类

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科,通过算法和模型让计算机从数据中学习,进行模型训练和优化,做出预测、分类和决策支持。Python成为机器学习的首选语言,…

阿里云k8s如何创建可用的api token

阿里云的 Kubernetes 配置文件(如您所提供的 YAML 格式文件)通常不会直接包含用于连接 Kubernetes 集群的令牌。而是包含了客户端证书和私钥数据,这些是用于通过证书验证而不是令牌验证的方式来与 Kubernetes API 服务器进行安全交互的。 1.…