设计模式总览

一、设计模式

介绍

种一棵树最好的时间是十年前,其次是现在 《援助的死亡》-- 比萨·莫约
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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/185359.shtml

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

相关文章

kendo-splitter动态分配分隔框大小

通过size方法&#xff0c;动态改变框大小&#xff0c;参考链接&#xff1a;https://docs.telerik.com/kendo-ui/api/javascript/ui/splitter/methods/size vue画面 <kendo-button type"primary" click"changePane">button</kendo-button><…

如何获取1688的订单详情

获取1688订单详情需要申请 第一步&#xff1a;先去1688-开放平台申请&#xff0c;申请不一定能通过&#xff0c;审批很严。 第二步&#xff1a;首次登录请先注册&#xff0c;注册成功后即可登录。 第三步&#xff1a;选择&#xff1a;我是第三方开发者 第三方是封装好的ap…

Ubuntu系统执行“docker ps“出现“permission denied“

当我们安装好Ubuntu时&#xff0c;使用鱼香ros一键安装指令 wget http://fishros.com/install -O fishros && . fishros 一键安装Docker后&#xff0c;执行"docker ps"出现"permission denied" seelina:~$ docker ps permission denied while …

解析编程中的技术迷题:常见挑战与应对策略

前言 在数字化时代的浪潮中&#xff0c;编程已经成为了一项至关重要的技能。无论是在软件开发、数据分析、人工智能还是互联网领域&#xff0c;编程都扮演着不可或缺的角色。作为一种创造性的活动&#xff0c;编程不仅仅是代码的书写&#xff0c;更是一种解决问题和创新的思维方…

.Net 8 Blazor下 Auto交互渲染模式试用

一、环境 C:\Users\zhuji>dotnet --version 8.0.100C:\Users\zhuji>dotnet --list-sdks 5.0.403 [C:\Program Files\dotnet\sdk] 6.0.404 [C:\Program Files\dotnet\sdk] 8.0.100 [C:\Program Files\dotnet\sdk] Microsoft Visual Studio Enterprise 2022 (64 位) - Cu…

Jmeter进阶使用:BeanShell实现接口前置和后置操作!

一、背景 我们使用Jmeter做压力测试或者接口测试时&#xff0c;除了最简单的直接对接口发起请求&#xff0c;很多时候需要对接口进行一些前置操作&#xff1a;比如提前生成测试数据&#xff0c;以及一些后置操作&#xff1a;比如提取接口响应内容中的某个字段的值。举个最常用…

【Java学习笔记】75 - 算法优化入门 - 马踏棋盘问题

一、意义 1.算法是程序的灵魂&#xff0c;为什么有些程序可以在海量数据计算时&#xff0c;依然保持高速计算? 2.拿老韩实际工作经历来说&#xff0c;在Unix下开发服务器程序&#xff0c;功能是要支持上千万人同时在线&#xff0c;在上线前&#xff0c; 做内测&#xff0c;一…

软著项目推荐 深度学习 植物识别算法系统

文章目录 0 前言2 相关技术2.1 VGG-Net模型2.2 VGG-Net在植物识别的优势(1) 卷积核&#xff0c;池化核大小固定(2) 特征提取更全面(3) 网络训练误差收敛速度较快 3 VGG-Net的搭建3.1 Tornado简介(1) 优势(2) 关键代码 4 Inception V3 神经网络4.1 网络结构 5 开始训练5.1 数据集…

轻盈未来:气膜建筑的绿色时尚

随着可持续发展理念的日益深入人心&#xff0c;建筑行业也在不断追求绿色、环保的设计与施工方案。气膜建筑&#xff0c;作为一种创新而轻盈的设计理念&#xff0c;正在走在绿色时尚的前沿。本文将探讨气膜建筑的独特之处以及其如何与环保理念相结合&#xff0c;领航着未来建筑…

计算机网络:应用层(下篇)

文章目录 前言一 、电子邮件&#xff08;Email&#xff09;1.邮件服务器2.SMTP[RFC 2821]3.邮件报文格式4.邮件访问协议 二、DNS&#xff08;域名系统&#xff09;1.DNS的历史2.DNS总体思路和目标&#xff08;1&#xff09;问题1&#xff1a;DNS名字空间&#xff08;2&#xff…

【PTA题目】7-4 缩写期刊名 分数 10

7-4 缩写期刊名 分数 10 全屏浏览题目 切换布局 作者 黄龙军 单位 绍兴文理学院 科研工作者经常要向不同的期刊投稿。但不同期刊的参考文献的格式往往各不相同。有些期刊要求参考文献所发表的期刊名必须采用缩写形式&#xff0c;否则直接拒稿。现对于给定的期刊名&#xff…

C语言:有一篇文章,共三行文字,每行有80个字符。要求分别统计出单词个数、空格数。

分析&#xff1a; #include<stdio.h>&#xff1a;这是一个预处理指令&#xff0c;将stdio.h头文件包含到程序中&#xff0c;以便使用输入输出函数。 int main()&#xff1a;这是程序的主函数&#xff0c;是程序执行的入口点。 char a[3][80];&#xff1a;定义了一个二维…

APP测试的测试内容有哪些,常见的Bug分类介绍!

对于产品的手机项目&#xff08;应用软件&#xff09;&#xff0c;主要是进行系统测试。而针对手机应用软件APP的系统测试&#xff0c;我们通常从如下几个角度开展&#xff1a;功能模块测试、兼容性测试、安装和卸载测试、软件更新测试、性能测试、用户体验性测试、交叉事件测试…

Vmware虚拟化引擎开启

VMware虚拟化引擎开启可以优化虚拟机性能和安全性&#xff0c;但总会出现打开后报错的情况&#xff0c;需要按以下步骤设置处理。 通过任务管理器查看CPU是否已经启用虚拟化 在启用或关闭windows功能中去掉和虚拟化配置相关的功能项后重启 在VMware中选择需要的虚拟化引擎&…

iOS 17.2:可以修改消息提示音了

时隔2周之后&#xff0c;苹果今日为开发者预览版用户推送了iOS 17.2 Beta4测试版的更新&#xff0c;已经注册Apple Beta版软件计划的用户只需打开设置--通用--软件更新即可在线OTA升级至最新的iOS 17.2测试版。 本次更新包大小为590M左右&#xff0c;内部版本号为&#xff08;…

二叉树题目:祖父结点值为偶数的结点和

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;祖父结点值为偶数的结点和 出处&#xff1a;1315. 祖父结点值为偶数的结点和 难度 5 级 题目描述 要求 给定二…

免杀原理(php)

免杀原理 0x01 前言 何为免杀&#xff0c;免杀就是一种逃脱杀毒软件查杀的方法&#xff0c;免杀的目的就是绕过“墙”&#xff0c;去执行危险的操作。那么如何绕过这堵“墙”&#xff0c;就是免杀的本质。有句俗话说得好“知己知彼&#xff0c;百战不殆”&#xff0c;想要用好…

[Android]AlertDialog对话框

1.介绍AlertDialog AlertDialog是Android中常用的对话框组件之一&#xff0c;用于在应用程序中显示一些提示信息、警告、确认信息或者提供用户进行选择的界面。AlertDialog通常用于与用户进行交互&#xff0c;例如要求用户确认某个操作、输入一些信息或者从一组选项中选择一个。…

Android的启动模式

Android的四种启动模式&#xff1a;standard、singleTop、singleTask和singleInstance。 1.standard Android默认的启动模式是standard&#xff0c;每启动一个Activity&#xff0c;它都会在返回栈中入栈&#xff0c;并处于栈顶&#xff0c;不管这个返回栈是否存在这个activit…

【idea】设置鼠标滚轮控制缩放大小

1、点击file 选择Setting 2、点击Editor 下面的 General 3、勾选 Mouse Control 下面的 Change font size with CtrlMouse Wheel in 4、点级apply 5、按 ctrl键 鼠标滚轮缩放字体的大小