当前位置: 首页 > news >正文

设计模式总览

一、设计模式

介绍

种一棵树最好的时间是十年前,其次是现在 《援助的死亡》-- 比萨·莫约
The best time to plant a tree was 10 years ago。 The second best time is now。 《dead aid》-- Dambisa Moyo 

1、创建型模式

1.1、单例模式

        确保一个类最多只有一个实例,并提供一个全局访问点,可以分为预加载和懒加载。

1.2、原型模式

        通过复制现有的实例来创建新的实例,无需知道相应类的信息。其实就相当于,在使用的时候刚好有这么一个对象,但是不能直接用,clone一个一模一样的对象出来,基本上就是原型模式。

        深拷贝:将一个对象复制以后,基本数据类型会被重新创建,而引用类型,指向的还是原来对象指向的应用。

        浅拷贝:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深拷贝进行了完全彻底的复制,而浅拷贝不彻底。Java中clone,如果是基本类型则属于深拷贝,如果包含了引用类型则属于浅拷贝。

1.3、建造者模式

        将一个复杂对象的构造与它的表示分离,使得同样的创建可以有不同的表示。

1.4、简单工厂模式

1.5、工厂方法模式

1.6、抽象工厂模式

2、行为型模式

2.1、策略模式

避免出现if-else、switch;

2.2、责任链模式

俗称踢皮球。 把某一个请求放到某一个链式请求当中。请求的是会把链中的每一个对象都执行一遍。 审批流程。可以将请求和处理进行解耦,请求处理者也就是节点对象只需要关系自己内部处理的逻辑即可, 不感兴趣的内容可以继续转给下一个节点对象来处理。链式结构比较灵活,可以动态的添加或者删除节点,易于拓展,符合开闭原则。 使用的是要注意出现死循环的情况出现,链太长的化可能影响程序执行的效率。

2.3、命令模式

在项目开发的时候不会很常见。

2.4、观察者模式

观察者模式又称为发布订阅模式。

2.5、模板方法模式

定义算法的骨架,一次性实现算法中不变的部分,并将可变的部分交给子类来实现,各个子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免了代码的重复。 模板方法中有一部分能力是开放给子类的,整体的方法步骤父类已经制定好了。模板方法一般通过继承实现,如果父类需要改的化,子类也需要改一遍,父类的稳定很重要。

2.6、委派模式

委托书、老板和员工、老板下达任务给员工,员工完成以后,将结果给老板。 双亲委派模型、BeanDefinition、DispatcherServlet。 委派模式属于行为性模式,代理模式属于结构型模式。 委派模式注重的结果,属于一种特殊的静态代理,全权代理。 委派模式注重的任务派遣,注重结果。 代理模式注重的是代码的增强,注重过程。

2.7、迭代器模式

迭代器模式又称为游标模式,提供一种顺序访问元素或者集合中元素的方法,而无需暴露集合内部表示,抽离集合对象的迭代行为到迭代器中,提供一致访问接口。 访问一个集合对象的内容而无需暴露它的内部表示,为遍历不通的集合结构提供一个统一的访问接口。 将集合中的迭代功能,抽离出去,集合不用关心具体的迭代方法。 简单结构不用迭代,复杂结构使用迭代器 Map、List。日常开发中用的比较少。

3、结构型模式

3.1、代理模式

代理模式分为静态代理、动态代理(JDK动态代理、Cglib动态代理)。 两者的区别:Cglib采用的是继承的方式,采用覆盖父类的方法;JDK采用的是实现一个接口。 两者的目的是一样的:都是通过生成字节码,重组成新的类。 JDK对用户来说更加复杂,目标类必须实现一个接口;Cglib对目标类没有任何要求。效率更高,底层没用用到反射。 JDK生成逻辑较为简单、执行效率低。Cglib有个坑,即为目标代理类不能有final修饰的方法,是不能被代理的。 SpringAop(面向切面编程)则使用的是动态代理。一个切面就相当于一个动态代理。

3.2、门面模式

简单来说门面模式就是代理模式,只不过是静态代理。属于一种特殊的静态代理。门面模式的重点是在于封装,静态代理的重点在于增强,不增强的静态代理即为门面模式。 门面模式和单例模式,很多时候会把门面模式做成单例模式。 门面模式的优点:简化了调用的过程、建设系统的依赖、更好的划分访问的层次、符合迪米特法则:最少知道原则。 门面模式不符合开闭原则,因为在封装内部逻辑发生变化的时候,门面需要改变。 门面模式可能会破坏单一职责原则,即所谓的万能类,会增加后期的维护成本。

3.3、装饰器模式

比继承更加具有扩展性,更加灵活,把扩展放到运行的时候,可以透明的并且动态的扩展一个类功能。可以方便的时候在运行的时候进行扩展、撤销。 装饰器模式像一种特殊的静态代理,装饰模式强调的是自身功能的拓展,是可以动态定制的拓展,用户自己说了算,是一种透明的拓展。 代理模式强掉的是增强,对用户不透明,用户没有多少自主权。 装饰器模式是继承的有利补充,装饰器模式完全遵守开闭原则,装饰器模式的代码较多,会增加系统的复杂性,动态装饰的时候,代码也更加复杂了。

3.4、享元模式

资源可以重复利用,避免系统中大量相似的对象创建,避免反复创建对象。享元模式大部分情况下都和工厂模式配合使用。共享数据库链接。 享元模式是一种池化技术,把经常使用的对象提前缓存起来。JDBC链接池内部采用享元模式,减少创建链接时候的耗时。 将现用的资源重复利用起来,轻量级的模式,是一种线程池的模式。内部状态:不变的状态,外部状态:变化的状态 享元模式经常用到系统底层的开发,以便解决系统的性能问题;系统中有大量的相似对象、需要缓冲池的场景。 内部状态:不变的内容 外部状态:变化的内容

3.5、组合模式

组合和聚合不同,组合中每个部件的生命周期是一样的,同生共死,聚合则不然,聚合可以随意拆解。组合模式也称为整体部分模式。 尽量使用组合不要用继承。心在一起叫团队,人在一起叫团伙。

3.6、适配器模式

适配器模式也叫变压器模式,适配器模式用来解决兼容的情况。可能会增加系统的复杂性。可能会降低代码的可读性。适配器模式分为类适配器、对象适配器、接口适配器, 其中多个接口可以用一个适配器实现,也可以这多个接口拆分成多个适配器单独处理,但是这样可能就增加了代码的复杂度了。

3.7、桥接模式

桥接模式是多重继承的一种替代,为了将抽象的部分和具体的部分结合起来,但是不通过继承的方式来实现。通过组合的模式来代替继承完成。 符合合成复用原则、符合开放封闭原则,但是增加了理解的难度。属于一种特殊的组合模式。

4、新设计模式

5、设计模式六大规则

单一职责原则:Single Responsibility Principle (SRP)

开闭原则:Open Close Principle (OCP)

里是替换原则:Liskov Substitution Principle (LSP)

迪米特法则(最少知道原则): The Least Knowledge Principle (LKP)

接口隔离原则:Interface Segregation Principle (ISP)

依赖倒置原则:Dependency Inversion Principle(DIP)

6、设计模式总览

设计模式用的好就是架构师,用的不好就是码农

7、设计原则

每个人都有义乌捍卫、遵守和完善原则,原则可以修正,但是不能肆意妄为。

SRP: 每个软件模块的职责要单一,衡量标准是模块是否只有个被修改的原因,职责越单一,被修改的原因就越少,模块的内聚性越高,被复用可能性就越大,也更容易被理解。

OCP: 软件实体应该对扩展开放,对修改关闭。

LSP: 程序中父类型都应该可以正确地被子类型替换,里是替换原则由2008年图灵奖得主,美国第一位计算机科学女博士Barbara Liskov教授和卡内基.梅隆大学Jeannette Wing教授于1994年提出的。

ISP: 多个特定客户端接口要好于一个宽泛用途的接口。接口隔离原则认为不能强迫用户去依赖那些他们不适用的接口, 换句话说,使用多个接口比使用单一的总接口要好。

DIP: 模块之间的交互应该依赖抽象,而非实现,DIP要求高层模块不应该依赖于底层模块,二者都应该依赖于抽象,抽象不应该依赖于细节,细节应依赖于抽象。

DRY: DRY原则特指在程序设计和计算中避免重复代码。

YAGNI: 极限编程,提倡的原则,是指你自以为有用的功能,实际上都是用不到的,因此处理核心功能之外,其他的功能一概不要提前设计,这样可以大大加快开发进程。

Rule of Three:  某个功能第三次出现的时候,就有必要进行抽象化了,第一次用到某个功能时,写一个特定的解决方法,第二次用到的时候,复制上一次的代码,第三次出现的时候,才着手抽象化,写出通用的解决方法。

KISS: 真正的简单绝不是毫无设计感,上来就写代码,而是宝剑锋从磨砺出,亮剑的时候犹如一到华丽的闪电,背后却又大量的艰辛和积累,正真的简单不是不思考,而是先发散,再收敛,在纷繁复杂中,把握问题的核心。

POLA: 写代码不是写侦探小说,要的简单易懂,而不是是不是冒出个 Surprise。

相关文章:

设计模式总览

一、设计模式 介绍 种一棵树最好的时间是十年前,其次是现在 《援助的死亡》-- 比萨莫约 The best time to plant a tree was 10 years ago。 The second best time is now。 《dead aid》-- Dambisa Moyo 1、创建型模式 1.1、单例模式 确保一个类最多只有一个实…...

数据链路层之VLAN基本概念和基本原理

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…...

UVA11729 Commando War

UVA11729 Commando War 题面翻译 突击战 你有n个部下,每个部下需要完成一项任务。第i个部下需要你花Bj分钟交代任务,然后他就会立刻独立地、无间断地执行Ji分钟后完成任务。你需要选择交代任务的顺序,使得所有任务尽早执行完毕&#xff08…...

【数据库】数据库基于封锁机制的调度器,使冲突可串行化,保障事务和调度一致性

封锁使可串行化 ​专栏内容: 手写数据库toadb 本专栏主要介绍如何从零开发,开发的步骤,以及开发过程中的涉及的原理,遇到的问题等,让大家能跟上并且可以一起开发,让每个需要的人成为参与者。 本专栏会定期更…...

大文件分片上传、分片进度以及整体进度、断点续传(一)

大文件分片上传 效果展示 前端 思路 前端的思路&#xff1a;将大文件切分成多个小文件&#xff0c;然后并发给后端。 页面构建 先在页面上写几个组件用来获取文件。 <body><input type"file" id"file" /><button id"uploadButton…...

Pytest 的小例子

一个简单的例子 下面代码保存到test_pytest.py 一个简单的例子 def inc(x):return x 1def test_answer():assert inc(3) 5def test_ask():assert inc(4) 5 pytest 需要安装一下 pip install pytest (Venv) D:\pythonwork>pip install pytest Collecting pytestDown…...

大数据(十一):概率统计基础

专栏介绍 结合自身经验和内部资料总结的Python教程,每天3-5章,最短1个月就能全方位的完成Python的学习并进行实战开发,学完了定能成为大佬!加油吧!卷起来! 全部文章请访问专栏:《Python全栈教程(0基础)》 再推荐一下最近热更的:《大厂测试高频面试题详解》 该专栏对…...

web前端之TypeScript

MENU typescript类型别名、限制值的大小typescript使用class关键字定义一个类、static、readonlytypescript中class的constructor(构造函数)typescript中abstractClass(抽象类)、extends、abstracttypescript中的接口、type、interfacetypescript封装属性、public、private、pr…...

计网Lesson6 - IP 地址分类管理

文章目录 1. I P IP IP 地址定义2. I P v 4 IPv4 IPv4 的表示方法2.1 I P v 4 IPv4 IPv4 的分类编址法2.2 I P v 4 IPv4 IPv4 的划分子网法2.2.1 如何划分子网2.2.2 如何确定子网的借位数2.2.3 总结2.2.4 题目练习 2.3 I P v 4 IPv4 IPv4 的无分类编址法 1. I P IP IP 地…...

Nat. Mach. Intell. | 预测人工智能的未来:在指数级增长的知识网络中使用基于机器学习的链接预测

今天为大家介绍的是来自Mario Krenn团队的一篇论文。一个能够通过从科学文献中获取洞见来建议新的个性化研究方向和想法的工具&#xff0c;可以加速科学的进步。一个可能受益于这种工具的领域是人工智能&#xff08;AI&#xff09;研究&#xff0c;近年来科学出版物的数量呈指数…...

MySQL海量数据配置优化教程

1.缓存大小调整 缓存是数据库中用于减少磁盘 I/O 操作的重要机制。通过增加缓存大小&#xff0c;可以减少对磁盘的访问&#xff0c;从而提高查询性能。 可以使用 innodb_buffer_pool_size 参数来调整 InnoDB 缓存的大小。例如&#xff0c;将缓存大小设置为服务器内存的 70% my…...

Mac-idea快捷键操作

–以下是程序员在Mac中常用的快捷键 弹出程序坞ctrol f3 窗口满屏&#xff0c;半屏 ctrol command f 切换同一个程序的窗口 command ~ 打开最小化窗口 command tab option 拷文件路径 command option c 显示隐藏文件command shift . 显示所有窗口 control 向上箭头 chrome 全屏…...

HarmonyOS脚手架:UI组件之文本和图片

前言 关于HarmonyOS脚手架&#xff0c;本篇是系列的第二篇&#xff0c;主要实现UI组件文本和图片的常见效果查看&#xff0c;本身功能特别的简单&#xff0c;其目的也是很明确&#xff0c;方便大家根据效果查看相关代码实现&#xff0c;可以很方便的进行复制使用&#xff0c;当…...

详细学习Pyqt5中的6种按钮

Pyqt5相关文章: 快速掌握Pyqt5的三种主窗口 快速掌握Pyqt5的2种弹簧 快速掌握Pyqt5的5种布局 快速弄懂Pyqt5的5种项目视图&#xff08;Item View&#xff09; 快速弄懂Pyqt5的4种项目部件&#xff08;Item Widget&#xff09; 快速掌握Pyqt5的6种按钮 快速掌握Pyqt5的10种容器&…...

【工具】Zotero|使用Zotero向Word中插入引用文献(2023年)

版本&#xff1a;Word 2021&#xff0c;Zotero 6.0.30 前言&#xff1a;两年前我找网上插入文献的方式&#xff0c;网上的博客提示让我去官网下个插件然后才能装&#xff0c;非常麻烦&#xff0c;导致我对Zotero都产生了阴影。最近误打误撞发现Zotero自带了Word插件&#xff0c…...

利用Python爬虫爬取豆瓣电影排名信息

可以使用第三方库Beautiful Soup和Requests来编写一个简单的爬虫&#xff0c;从豆瓣电影Top100页面获取信息 import requests from bs4 import BeautifulSoupdef get_douban_top100():url https://movie.douban.com/top250headers {User-Agent: Mozilla/5.0 (Windows NT 10.…...

灯光开不了了,是不是NVIDIA的问题

如果你跟我一样灯光亮度调节不了了&#xff0c;然后显示适配器又没有了&#xff0c;你看一下是不是和我这个大怨种一样把NVIDIA卸了&#xff0c;为了这个东西&#xff0c;这屏幕亮瞎我的眼镜&#x1f622;&#x1f622;。只需要进入官网&#xff0c;你就可以直接找到&#xff0…...

线性可分SVM摘记

线性可分SVM摘记 0. 线性可分1. 训练样本到分类面的距离2. 函数间隔和几何间隔、(硬)间隔最大化3. 支持向量 \qquad 线性可分的支持向量机是一种二分类模型&#xff0c;支持向量机通过核技巧可以成为非线性分类器。本文主要分析了线性可分的支持向量机模型&#xff0c;主要取自…...

LabVIEW在调用image.cpp或drawmgr.cpp因为DAbort而崩溃

LabVIEW在调用image.cpp或drawmgr.cpp因为DAbort而崩溃 出现下列问题&#xff0c;如何解决&#xff1f; 1. LabVIEW 程序因image.cpp或drawmgr.cpp中的错误而崩溃 2. 正在通过cRIO-9034运行独立的LabVIEW应用程序&#xff0c;但它因drawmgr.cpp中的错误而崩溃 …...

nodejs微信小程序+python+PHP贵州旅游系统的设计与实现-计算机毕业设计推荐MySQL

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙&#xff08;HarmonyOS5&#xff09;中集成百度地图&#xff0c;可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API&#xff0c;可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​&#xff1a;下载安装 ​​De…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...