设计模式相关知识

news2024/9/24 4:11:54
  • 核心思想
    • 识别代码中稳定的部分和变化的部分,然后通过抽象、封装等手段,将变化隔离出去,从而达到整体的稳定
  • 六大原则
    • 单一职责
    • 开发封闭
    • 里氏替换原则
    • 接口隔离
    • 依赖倒转
    • 迪米特法则
  • 创建
    • 工厂模式
      • 问题
        • 构造器表现力不足
        • 无法干预创造过程
        • 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.coloradmin.cn/o/2159226.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

s3c2440——UART串口通信

一、通信方式 1、并行通信:一次可收发2bit/2bit以上。通信效率高;但对SOC硬件资源占用率太高。 串行通信:一次通信传递1bit。降低对硬件占用率;但通信速率低。 2、单工通信:只能A发送,B接收。 半双工通信…

D. Minimize the Difference (Codeforces Round 973 Div. 2)

D. Minimize the Difference 思路: 发现操作是单向的从左往右取高补低,最终目标是尽可能趋于平均,使最大值最小和使最小值最大。可以用二分答案法分别找到两个最值,然后做差即可。 关于这种算法的正确性没有做严格的证明&#x…

国庆节适合买什么东西?精选五款实用又优惠的多功能好物!

临近国庆,我猜很多朋友已经开始为假期做好准备,计划开启出游和购物的节奏了!大家都希望在国庆期间,买到一些平时因为价格太贵而舍不得下单的好物!作为一名家居兼数码博主,每年国庆的时候我都会疯狂采购各种…

那年我双手插兜,使用IPv6+DDNS动态域名解析访问NAS

估计有很多科技宅和我一样,会买一个NAS存储或者自己折腾刷一下黑群晖玩玩,由于运营商不给分配固定的公网IP,就导致我在外出的时候无法访问家里的NAS,于是远程访问常常受到IP地址频繁变动的困扰。为了解决这一问题,结合…

对FPGA加载过程中不同寄存器初始化方式现象的分析

对FPGA加载过程中不同寄存器初始化方式现象的分析 概述目的术语和缩略语参考资料 相关原理分析MMCM时钟锁定分析声明信号时进行初始化RTL测试代码示波器现象 同步复位/置位初始化RTL测试代码示波器现象 异步复位/置位初始化RTL测试代码示波器现象 不进行任何初始化操作&#xf…

JSP 指令标识和脚本标识的使用

文章目录 前言一、JSP 页面是什么?二、JSP 基本语法 1.指令标识 (1)page 指令(2)include 指令(3)taglib 指令2.脚本标识总结 前言 在进行Java Web 应用开发的过程中,JSP 是必不可少的…

9.19工作笔记

怎么做多空对冲 脚本2 read_coin选币单币涨跌幅计算单币资金曲线单币资金曲线均值得到周期总体资金曲线周期总体资金曲线得到周期总体涨跌幅周期总体涨跌幅计算得到总体资金曲线 脚本2怎么实现多空对冲的 首先读取factors和periods中的文件,然后read_coin得到结…

Proteus-7.8sp2安装

一、D盘新建空文件夹,名为Proteus。 二、安装软件 1.双击P7.8sp2.exe 2.next 三、破解 1.双击 Proteus Pro 7.8 SP2破解 1.0.exe 2. 升级 打开软件 四、汉化 1.将如下两个文件复制到 D:\Proteus\BIN 路径中 重新打开软件,汉化成功

【在.net6和WPF框架下进行海康SDK开发】(一)如何引用Dll

最近有个上位机项目,需要将海康VisionMaster的部分功能嵌入到统一的界面。项目使用WPFdotNet6开发,UI库使用HandyControl。 先说下需求,在某个TabItem内嵌入一个UserControl,UserContr内嵌入VisionMaster运行界面。 本以为按照海康…

10年计算机考研408-计算机网络

【题33】下列选项中,不属于网络体系结构所描述的内容是() A.网络的层次 B.每一层使用的协议 C.协议的内部实现细节 D.每一层必须完成的功能 解析: 本题考查的是网络体系结构相关的概念。 图1描述了网络的7层架构以及每一层所要完成…

智能新突破:AIOT 边缘计算网关让老旧水电表图像识别

数字化高速发展的时代,AIOT(人工智能物联网)技术正以惊人的速度改变着我们的生活和工作方式。而其中,AIOT 边缘计算网关凭借其强大的功能,成为了推动物联网发展的关键力量。 这款边缘计算网关拥有令人瞩目的 1T POS 算…

某文书网爬虫逆向

一、抓包分析 请求参数和响应数据都有加密 二、逆向分析 老方法、下xhr断点 加密实现逻辑都在这个方法里 执行到这的时候,在向下跟栈数据就已经渲染出来了,说明是在这个方法里进行的解密 解密方法,data.result为加密数据,data.s…

Plant Disease Expert:植物病害数据集(猫脸码客 第197期)

Plant Disease Expert 数据集详细介绍 一、引言 在农业生产的广阔领域中,植物病害始终是一个不可忽视的挑战。它不仅直接威胁到作物的健康生长,还可能导致严重的产量下降,进而影响全球粮食安全和农业经济稳定。据权威机构估计,全…

18 基于51单片机的心率体温监测报警系统(包括程序、仿真、原理图、流程图)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机 ds18B20读取温度, 设置初始心率65 设置温度阈值38 心率阈值60 100 如果超过阈值,蜂鸣器报警,led灯亮 二、硬件资源 基于KEIL5编写C代码&#xf…

栈的操作:进栈,出栈,读栈顶元素

代码&#xff1a; #include<iostream> using namespace std; template<class T> class sq_Stack {private:int mm;int top;T *s;public:sq_Stack(int);void prt_sq_Stack();int flag_sq_Stack();void ins_sq_Stack(T);T del_sq_Stack();T read_sq_Stack(); }; tem…

高等代数笔记(2)————(弱/强)数学归纳法

数学归纳法的引入情景其实很简单&#xff0c;就是多米诺骨牌。 推倒所有多米诺骨牌的关键就是推倒第一块&#xff0c;以及确保第一块倒下后会带动第二块&#xff0c;第二块带动第三块&#xff0c;以此类推&#xff0c;也就是可以递推。由此我们可以归纳出所有的多米诺骨牌都可…

开箱元宇宙| 探索 Great Entertainment Group 如何利用 Web3 和数字创新重新定义活动体验

有没有想过 Web3 等尖端技术是如何改变娱乐行业的&#xff1f;在本期「开箱元宇宙」系列中&#xff0c;我们与 Great Entertainment Group (GEG) 的 Web3 顾问 Rob Lacey 深度访谈&#xff0c;探讨这家充满活力的公司如何在其活动中开拓数字创新。 与我们一起揭示 GEG 如何将 …

力扣 LCR 020 回文子串 -Python

题目链接&#xff1a;LCR 020. 回文子串 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给定一个字符串 s &#xff0c;请计算这个字符串中有多少个回文子字符串。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会被视…

python全栈学习记录(十七)logging、json与pickle、time与datatime、random

logging、json与pickle、time与datatime、random 文章目录 logging、json与pickle、time与datatime、random一、logging二.json与pickle三.time与datatime四.random 一、logging logging模块用来记录日志信息。 import logging # 进行基本的日志配置 logging.basicConfig( fi…

pycharm安装教程,超详细

引言 PyCharm官网提供了两个版本&#xff0c;第一个版本是Professional&#xff08;专业版本&#xff09;&#xff0c;这个版本功能更加强大&#xff0c;主要是为Python和web开发者而准备&#xff0c;是需要付费的。第二个版本是社区版&#xff08;Community&#xff09;&…