设计模式【精简概述, 应用场景】(个人总结)

2023-11-17

   声明:
      1. 本文为我的个人复习总结, 并那种从零基础开始普及知识内容详细全面, 言辞官方的文章
      2. 由于是个人总结, 所以用最精简的话语来写文章
      3. 若有错误不当之处, 请指出

Gof23设计模式分为三类:

  1. 创建型模式 负责组件的创建

  2. 结构型模式 负责组件的定义

  3. 行为型模式 负责组件的使用(服役)

七大设计原则:

  1. OCP开闭原则: 对扩展开放, 对修改关闭; 扩展新类而不是修改旧类

  2. 依赖倒置原则: 面向抽象的接口编程,而不是面向具体的类

  3. 单一职责原则: 每个类只负责自己的事情, 而不是变成一个万能类

  4. 接口隔离原则: 各个类建立自己的专用接口,而不是建立万能接口

  5. 合成复用原则: 优先使用类的组合, 其次再使用继承

  6. 里氏替换原则: 继承父类而不去改变父类

  7. 迪米特法则: 无需直接交互的两个类, 如果需要交互, 请使用中间者

一、创建型模式:

创建型模式关注点是"怎样创建出对象"

优点:

  1. 将对象的创建与使用分离

  2. 降低系统的耦合度

  3. 使用者无需关注对象的创建细节

单例模式:

保证只有一个对象

实际应用:

  1. java.lang.Runtime:

    体现了饿汉式单例

    System.gc( ), System.exit( ) 底层调用的都是Runtime实例

  2. Collections集合工具类里的空集合

    体现了内部类懒汉式单例

  3. 上下文(环境)对象

三种工厂模式:

对象的创建由相关的工厂来完成

  1. 工厂方法模式:

    • 简单工厂

      一个方法, 内部使用if-else判断 (不利于OCP原则)

    • 工厂方法

      多个方法, 每个产品一个方法 (好了些, 但依旧有些不利于OCP原则)

  2. 抽象工厂模式

    很多工厂类 (有利于OCP原则)

建造者模式:

对象的创建由一个建造者来完成; 工厂模式是生成一个个零件, 建造者模式不仅生成零件, 而且还将这些零件进行组合;

set方法链式调用, 每个参数都可以传入但不是必须, 最后.build( )返回创建的实例 实际应用: StringBuilder的append( )方法

原型模式:

克隆一个自己出来

二、结构型模式:

结构型模式关注点是"怎样组合类/对象"

分为两种:

  1. 类结构型模式 通过继承来实现

  2. 对象结构型模式 通过属性组合来实现

根据合成复用原则, 第二种更好

适配器模式:

连接两个接口, 使两个不兼容接口进行适配

实际应用:

  1. Tomcat将自身的tomcat.Request转为标准的servlet.Request

  2. IO转换流

桥接模式:

连接同一个东西的两个不同维度

实际应用: IO转换流

过滤器模式:

类似职责链模式

组合模式:

对象间进行属性组合

外观模式:

去医院看病可能要去挂号、门诊、取药, 让患者觉得很复杂, 如果让接待人员来处理这些事情, 就很方便

接待人员就是外观

享元模式:

共享池技术, 使对象可以复用

实际应用: 连接池 & 线程池 & 字符串常量池

装饰者模式:

向一个现有的对象添加新的功能,同时又不改变其结构; wrapper一下使功能更强大

实际应用:

  1. IO流的 包装流(处理流)对节点流的包装

  2. 分布式Session中使用Redis存储

  3. MyBatisPlus中QueryWrapper的包装

代理模式:

  1. 静态代理

    代理类和非代理类必须得实现了同一个接口, 即只能代替兄弟类

    实现: 通过普通方法调用来实现

    静态代理等效于装饰

  2. JDK动态代理

    代理类和非代理类不必非得实现了同一个接口, 只要被代理类实现任意接口都行

    实现: 通过invoke方法反射调用来实现

    实际应用: RPC框架里的远程调用, 使调远程API就如调本地API一样便捷

  3. CgLib动态代理

    代理类即使没有父接口也行, 类别被final修饰就行

    实现: 通过动态生成其子类来实现

    实际应用:

    1. Spring的AOP, 如拦截器, 事务, 日志

    2. MyBatis根据Mapper接口生成其代理类

三、行为型模式:

行为型模式关注点是"怎样运行使用 类/对象"

分为两种:

  1. 类行为型模式 通过继承来实现

  2. 对象行为型模式 通过属性组合来实现

根据合成复用原则, 第二种更好

模板方法模式:

父类做出了个模板, 即实现了一部分内容, 另一部分靠子类自己实现

实际应用:

  1. JDK抽象类

  2. AQS允许自定义实现类

  3. RedisTemplate允许自定义实现类

策略模式:

每一种算法封装成一个策略, 根据不同的策略来调用不同的方法

实际应用: 创建线程池时传参的几种拒绝策略

状态模式:

和策略模式分像, 但状态需要维护状态改变(即状态流转)

命令模式:

Controller, Service, Dao中, 上一层有一个属性指向着下一层的对象, 然后使用此属性调用下一层的方法来处理业务

实际应用: 经典的MVC三层架构

职责链模式:

Filter(方法调用时会压栈递归) + 维护链条FilterChain + 游标(相当于下标位置, 第几个Filter)

实际应用: Tomcat过滤器的底层是 结合FilterChain进行Filter过滤

观察者模式(发布订阅模式):

当一个对象状态发生改变时,其被依赖的 进行观察的对象都得到通知

实际应用:

  1. Redis的哨兵

  2. Vue(视图和数据)的双向绑定

中介者模式:

一个中介对象来封装一系列其他对象的交互, 调用方只需要调用中介着即可, 而不用多次调用其他对象

迭代器模式:

遍历本类里面的集合

实际应用: Collection集合的遍历

访问者模式:

XiaoAiRobot类能访问自己的cpu和disk, XiaoAiRobot构造器参数传入Visitor类,

且Visitor也能访问XiaoAiRobot的cpu和disk, 对其进行升级

备忘录模式:

快照保存其状态

实际应用:

  1. Hadoop, Flink的检查点 持久化保存

  2. Session的活化钝化

    如果网站的Session的个数过多的话,就把Session序列化到硬盘中,如果用户再访问的时候再把Session数据反序列化到内存中

解释器模式:

抽象语法树的解析, 语法分析, 语义分析

实际应用: 编译器, MyBatis #{ }的解析

IO流使用了: 装饰者模式, 享元模式, 适配器模式, 桥接模式

线程池使用了: 享元模式, 工厂模式, 策略模式

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式【精简概述, 应用场景】(个人总结) 的相关文章

  • JavaScript的设计模式解析——工厂模式

    这几天一直在看 JavaScript高级程序设计 在第六章面向对象的程序设计中 自我感觉对于小白而而言 会一定程度的难以理解 什么意思啊 根本不明白哇等等 注意 大神请略过 小小码农 不敢妄言 首先 我们开门见山 什么是工厂模式 工厂模式能
  • Spring源码学习之BeanDefinition源码解析

    本文作者 磊叔 GLMapper本文链接 https juejin cn post 6844903553820000269 Bean的定义主要由BeanDefinition来描述的 作为Spring中用于包装Bean的数据结构 今天就来看看
  • C++设计模式(8)——命令模式

    命令模式 亦称 动作 事务 Action Transaction Command 意图 命令模式是一种行为设计模式 它可将请求转换为一个包含与请求相关的所有信息的独立对象 该转换让你能根据不同的请求将方法参数化 延迟请求执行或将其放入队列中
  • 行为型模式-策略模式

    package per mjn pattern strategy 抽象策略类 public interface Strategy void show package per mjn pattern strategy 具体策略类 用来封装算法
  • C++ 装饰器模式

    什么是装饰器模式 装饰器模式是一种结构型设计模式 实现了在不改变现有对象结构的的同时又拓展了新的功能 装饰器本质上是对现有对象的重新包装 同时装饰器又称为封装器 如何理解装饰器模式 以笔记本电脑为例 当我们购买了一台新笔记本电脑 但我们发现
  • 设计模式——原型模式

    原型模式顾名思义 就是指以某个实例为原型 copy出一个新的实例 该实例属性与原型相同或者是类似 很多时候 我们需要创建大量的相同或者相似的对象 如果一个个用new 构造函数的形式去创建的话比较繁琐 就像孙悟空要想变出成千上万个猴子猴孙总不
  • 小谈设计模式(1)—总序

    小谈设计模式 1 总序 专栏地址 开始操作 设计模式总论 设计模式是什么 组成要素 模式名称 问题描述 解决方案 效果描述 设计模式有什么作用 提供可重用的解决方案 提高代码的可读性和可维护性 促进代码的可扩展性 提高代码的灵活性和可重用性
  • Java设计模式:装饰者模式(Decorator Pattern)

    装饰者模式 涉及的重要设计原则 类应该对扩展开放 对修改关闭 装饰者模式定义 装饰者模式动态地将责任附加到对象上 若要扩展功能 装饰者提供了比继承更有弹性的替代方案 UML类图 装饰者模式事例 咖啡店 咖啡种类 1 深焙咖啡 DarkRoa
  • 六大设计原则--开闭原则

    定义 software entities like classes modules and functions should be open for extension but closed for modifications 一个软件实体
  • 设计模式 -- 工厂模式(Factory Pattern)

    简单工厂模式 Simple Factory Pattern 根据传入的参数决定实例化哪个对象 优点 不直接在客户端创建具体产品的实例 降低了耦合性 缺点 违反了开闭原则 对扩展开放 对修改关闭 不容易形成高内聚松耦合结构 每当我们增加一种产
  • 设计模式-建造者模式

    文章目录 建造者模式 创建复杂对象的优雅方式 什么是建造者模式 建造者模式的使用场景 优缺点 示例 使用建造者模式创建电脑对象 建造者模式 创建复杂对象的优雅方式 在软件开发中 有时候我们需要创建具有复杂结构和多个组件的对象 直接在客户端代
  • 设计模式(5)-适配器模式(Adapter Pattern)

    适配器模式 Adapter Pattern 顾名思义 就像变压器 转接头差不多 就像美国的生活电压是110V 中国是220V 就需要一个变压器将220V转换成110V 或者一个Type C接口想插如USB接口的东西 你就需要一个转换器 而这
  • 每日一问:你想如何破坏单例模式?

    前言 1 单例是什么 单例模式 是一种创建型设计模式 目的是保证全局一个类只有一个实例对象 分为懒汉式和饿汉式 所谓懒汉式 类似于懒加载 需要的时候才会触发初始化实例对象 而饿汉式正好相反 项目启动 类加载的时候 就会创建初始化单例对象 1
  • [C++]外观模式

    外观模式 Facade Pattern 隐藏系统的复杂性 并向客户端提供了一个客户端可以访问系统的接口 这种类型的设计模式属于结构型模式 它向现有的系统添加一个接口 来隐藏系统的复杂性 这种模式涉及到一个单一的类 该类提供了客户端请求的简化
  • 程序员必知的23种设计模式之组合模式

    文章目录 1 模式引出 学校院系展示需求 1 1 传统方案 1 2 传统方案问题分析 2 组合模式基本介绍 2 1 方案修改 3 组合模式解决的问题 4 组合模式的注意事项和细节 1 模式引出 学校院系展示需求 编写程序展示一个学校院系结构
  • DDD专家张逸:构建领域驱动设计知识体系

    张逸 读完需要 5分钟 速读仅需 2 分钟 领域驱动设计专家 曾就职于 ThoughtWorks 作为 Lead Consultant 为客户提供架构设计 大数据分析 持续交付 代码质量 敏捷管理等咨询服务 著译作包括 软件设计精要与模式
  • 哈工大2020软件构造Lab3实验报告

    本项目于4 21日实验课验收 更新完成 如果有所参考 请点点关注 点点赞GitHub Follow一下谢谢 2020春计算机学院 软件构造 课程Lab3实验报告 Software Construction 2020 Spring Lab 3
  • 设计模式—迭代器模式解析

    本文参考学习了 图解设计模式 中的代码实现和原理解释 迭代器模式 简介 Iterator 模式用于在数据集合中按照顺序遍历集合 就类似于我们的循环 一个个去遍历一个集合中的所有元素 示例代码 首先我们思考一个书本和书架的关系 显然 书架可以
  • 在AI技术的无情侵袭下,学学Java的23种设计模式还是非常有必要的

    目前国内80 程序员的主要工作是调用组合api实现各种业务需求 在顶层架构师设定好的框架下 做着重复且无聊的编码工作 如果未来ai被广泛应用 那么被替代的风险是很高的 比较扎心的是 其实目前用ai生成片段代码已经是各个公司比较普遍的做法了
  • 【设计模式之美】 SOLID 原则之五:依赖反转原则:将代码执行流程交给框架

    文章目录 一 控制反转 IOC 二 依赖注入 DI 三 依赖注入框架 DI Framework 四 依赖反转原则 DIP 一 控制反转 IOC 通过一个例子来看一下 什么是控制反转 public class UserServiceTest

随机推荐

  • Flutter笔记(二)

    一 Android 集成 Flutter 实现流程 闲鱼 头条 在 Android 集成 Flutter 模块都有自己的实现方案 闲鱼团队方案 头条团队方案 我们以官方方案方式为主 一 Android 集成 Flutter 实现流程 闲鱼
  • 区块链+教育 解决教育行业所面临的问题

    众所周知 教育对于一个国家 一个民族来说是成就未来的重要方式 它的社会职能 就是传递生产经验和社会生活经验 促进新生一代的成长 但是教育行业也有被一些问题困扰着 怎样运用区块链技术解决这些问题 1 完善学籍档案管理 我们都知道 现在很多地方
  • 基于规则的优化

    MySQL会对用户编写的查询语句执行一些重写操作 比如 移除不必要的括号 常量传递 移除没用的条件 表达式计算 最好让那个索引列以单独的形式出现在搜索条件表达式中 HAVING子句和WHERE子句的合并 如果查询语句中没用出现诸如 SUM
  • java web项目答辩答辩题总结(书本网上语言答辩+自己的语言答辩)

    答辩每个人的总分为1 5分 每个人主要问3个问题 开发流程 系统架构 项目模块 功能 项目得失重定向与转发 九个隐式对象 get与post的区辨 jsp有静态包含 动态包含 两者的区辨 什么是MVC web系统架构 java web项目答辩
  • 虚拟机ubuntu18.04桥接模式详解

    背景 虚拟机ubuntu18 04桥接模式下 配置静态ip 配置静态ip vim etc network interfaces 具体配置如下 auto lo iface lo inet loopback auto ens33 iface e
  • 算法题Day6-第三大的数

    给定一个非空数组 返回此数组中第三大的数 如果不存在 则返回数组中最大的数 要求算法时间复杂度必须是O n 示例 1 输入 3 2 1 输出 1 解释 第三大的数是 1 示例 2 输入 1 2 输出 2 解释 第三大的数不存在 所以返回最大
  • SQL查询结果按照指定内容排序

    一般来说 我们在开发SQL脚本的时候 遇到需要排序的内容 用order by需要排序的字段就可以满足我们排序的需求 asc为升序 desc为降序 不指定关键字默认为升序 但是有时候 我们需要的排序不仅仅是升序和降序 asc与desc并不能满
  • Kibana 7.X 导出CSV报告

    背景 由于有时候需要基于日志做一些处理 由官网得知 ES7 3 0发布的新特性 从保存的搜索中导出CSV 我们的Kibana刚好是7 3 0 于是将自己的使用经验及解决的问题 分享给有需要的小伙伴 一 使用步骤 1 1 保存搜索 Disco
  • Spring Cloud 与 Dubbo 冲突吗——强强联合

    微服务开发选型 到底是基于 Dubbo 还是 Spring Cloud 相信不少开发的小伙伴都有拿这两个项目作过作比较的经历 本章节就带你走近这两个项目 二者究竟是竞争发展还是融合共赢 项目发展简介 我们还是先来看看 Dubbo 的发展历史
  • (递归)杨辉三角实现

    问题描述 杨辉三角形又称Pascal三角形 它的第i 1行是 a b i的展开式的系数 它的一个重要性质是 三角形中的每个数字等于它两肩上的数字相加 下面给出了杨辉三角形的前4行 1 1 1 1 2 1 1 3 3 1 思路 可以用二维数组
  • c++ string替换指定字符串

    string fnd dataset string rep labels string buf d data dataset ii jpg buf buf replace buf find fnd fnd length rep 去掉由于wi
  • ubuntu不息屏、隐藏其他软件图标 小技巧

    1 有时想安静的写写代码 但是这时候ubuntu老是自动进入休眠状态 这是你可以进入 设置 gt system setting gt power gt Brightness Lock 或者直接搜索Brightness Lock 将Turn
  • Latex学习笔记二——Overleaf在线练习

    锵锵 本文是基于Overleaf的Latex学习的第二部分 目录 1 结构化文档 2 添加图表 让论文更生动可读 2 1 Graphics 2 2 Floats 2 3 Tables 3 Bibliographies 1 结构化文档 这一部
  • SQl语句查询重复数据 只显示其中一条

    SQL查询重复数据 只显示其中一条 有重复数据主要有以下几种情况 1 存在两条完全相同的纪录 这是最简单的一种情况 用关键字distinct就可以去掉 example select distinct from table 表名 where
  • 电子专业 英语词汇大全(持续更新)

    文章目录 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 序号 词汇的领域 1 软件 软件开发 2 计算机 计算机网络 多媒体 3 单片机 电子 电子仪器 通信 A 序号 词汇 描述
  • GD32 和 ST32的区别

    TIM重载寄存器 复位值不一样 xxx xxx xxx xxxx
  • 服务器如何查询配置信息吗,如何查看linux服务器的配置信息

    如何查看linux服务器的配置信息 内容精选 换一换 本节介绍如何查看云服务器的mac地址 云服务器的mac地址不支持修改 登录Linux云服务器 执行以下命令 查看云服务器的mac地址 ifconfig查看MAC地址ifconfig登录L
  • 解决子盒子把父盒子撑破问题

    场景 div class demo 父盒子 div class box div 子盒子 div 当你设置子盒子的padding和border的时候就会把父盒子撑破 因为子盒子的宽度是100 而浏览器的默认盒模型为content box 即内
  • 遇到argument of type ‘Word2Vec‘ is not iterable不要慌。。。

    重要的事开头说 不要以为是返回值的问题或参数的问题 因为很有可能你学的那个是个老文档 现在已经改变函数了 报这个错我这里的原因是word2vec构造出来的模型不能遍历 原来代码 if word in model model就是用word2v
  • 设计模式【精简概述, 应用场景】(个人总结)

    声明 1 本文为我的个人复习总结 并非那种从零基础开始普及知识内容详细全面 言辞官方的文章 2 由于是个人总结 所以用最精简的话语来写文章 3 若有错误不当之处 请指出 Gof23设计模式分为三类 创建型模式 负责组件的创建 结构型模式 负