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

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(使用前将#替换为@)

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

  • 零信任架构

    零信任架构 参考文章 基于SDP技术构建零信任安全 怎样实现零信任安全架构 什么是零信任 物理边界曾经是可信网络和不可信网络之间的有效分割 防火墙通常位于网络的边缘 基于静态策略来控制网络流量 位于防火墙内部的用户会被授予高信任等级来访问企

随机推荐

  • 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设计模式分为三类 创建型模式 负责组件的创建 结构型模式 负