Java设计模式(23种设计模式 重点介绍一些常用的)
- 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
- 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
- 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
设计模式原则
开放封闭原则
就是对扩展开放,对原有类的修改封闭。在不影响原有类的基础上进行拓展
里氏代换原则
子类型必须能够替换父类型,也就是父类型的功能可以被复用。
单一职责原则
一个类仅应该有一个引起他变化的原因。可拓展性高。
依赖倒置原则
高层模块和底层模块都应该依赖于抽象,细节应该依赖于抽象。
比如电脑内存条坏了,我们仅仅需要更换内存条就行了,而不需要把cpu也换了,类似于一种解藕的思想。
迪米特法则
如果两个类不必直接通信,则可以通过一个第三者去转发调用。降低耦合度。
合成复用原则
原则是尽量使用合成/聚合的方式,而不是使用继承。
常用的模式
简单工厂模式
拿经典的加减乘除来举例
- 我们需要先封装一个算法抽象类,定义方法。
- 然后定义加减乘除四个子类继承该抽象类,并实现
- 最后在创建一个算法工厂类,通过switch(运算符)来实现对应的算法。
抽象工厂模式
比如封装一个多数据源的访问。
- 新建一个接口,定义访问的方法。
- 然后各个数据库为其创建对应的类,实现该接口。
- 再定义一个工厂接口,实现对应对象创建的方法。
- 再定义几个类去实现该接口的方法。
- 可以实例化对应的工厂去使用。
工厂方法模式
还是拿经典的加减乘除来举例
- 我们需要先封装一个算法抽象类,定义方法。
- 然后定义加减乘除四个子类继承该抽象类,并实现
- 最后在创建一个工厂接口。
- 定义多种算法工厂类实现该接口,例如将基础算法归于一类,高级算法归于一类。
- 最后再拿一个算法工厂类通过switch(运算符)去实现对应的算法。
抽象工厂模式可以将简单工厂模式和工厂方法模式进行整合。
从设计层面看,抽象工厂模式就是对简单工厂模式的改进(或者称为进一步的抽象)。
将工厂抽象成两层,抽象工厂 和 具体实现的工厂子类。程序员可以根据创建对象类型使用对应的工厂子类。这样将单个的简单工厂类变成了工厂集合, 更利于代码的维护和扩展。
装饰者模式
动态的给类添加一些额外的职责,就添加功能来说,该模式比生成子类更加灵活。
- 定义一个抽象类component
- concretecomponent类继承抽象类
- decorator继承了component的抽象类,可以从外部扩展component功能
- 定义具体装饰类继承decorator
- Component(抽象构件):定义一个对象接口,以规范准备接收附加责任的对象。
- ConcreteComponent(具体构件):实现Component接口,也就是给装饰者提供原始对象。
- Decorator(抽象装饰者):实现Component接口,持有对另一个Component对象的引用,并定义一个与Component接口一致的接口。
- ConcreteDecorator(具体装饰者):实现Decorator接口,给组件添加一些职责。
策略者模式
定义了算法策略,分别封装起来,让他们可以互相替换,不会影响到使用算法的客户。
- 定义一个算法抽象类
- 几个具体实现类
- 定义一个conext类,内部使用算法抽象类,实例化,并调用其的算法
- 抽象策略(Strategy)类:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
- 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现或行为。
- 上下文(Context)类:是使用算法的角色, 持有一个策略类的引用,最终给客户端调用。
模板模式(很简单)
定义一个算法骨架,将一些步骤延迟到子类中,使得子类不需要改变算法结构就可以重新定义某个步骤
- 一个抽象类
- 几个实现类
代理模式
为其他对象提供一种代理以控制该对象的访问
- 定义一个抽象类或接口
- 定义一个具体实现类继承该类
- 再定义一个具体代理类,并在内部将上一个具体类作为成员变量
动态代理与静态代理的区别就是代理类与被代理类有没有直接继承或实现的关系。
【设计模式】Java 的三种代理模式_创建代理对象的三大方式-CSDN博客
责任链模式
使多个对象都有机会去处理请求,从而避免请求的发送者和接收者的关系之前的耦合。将对象链接成一个链,并通过该链条传递该请求,直到有一个对象处理他。
- 定义一个父接口
- 实现多个子类,可以实现不同内容处理
- 通过链条方式将他们链接起来
- 先从底层开始处理
java设计模式---责任链模式详解_责任链模式 java-CSDN博客
Java设计模式-责任链模式_java责任链模式-CSDN博客
单例模式
保证一个类只有一个实例,并且提供一个访问他的全局访问点。
- 将类成员变量设置为静态
- 私有化其他构造方法,只留一个构造,且内部进行判断,如果已经实例化,则直接返回。
- 且在成员变量加volatile关键字
- 实例化成员变量时内部加上synchronized锁,防止并发创建多个实例。
- 或者采用静态初始化
代码示例
class Singleton{private static Singleton instance = new Singleton();private Singleton(){}public static Singleton getInstance(){return instance;}}
或者
class Singleton{private volatile static Singleton instance = new Singleton();private Singleton(){}public static Singleton getInstance(){if(instance==null){synchornized(Singleton.class){if(instance==null){instance=new Singleton();}}}return instance;}}
创建型模式
工厂方法模式
与简单工厂方法比较类似,在简单工厂基础上进行了二次封装,让各类的职责更加明确。
还是拿经典的加减乘除来举例
- 我们需要先封装一个算法抽象类,定义方法。
- 然后定义加减乘除四个子类继承该抽象类,并实现
- 最后在创建一个工厂接口。
- 定义多种算法工厂类实现该接口,例如将基础算法归于一类,高级算法归于一类。
- 最后再拿一个算法工厂类通过switch(运算符)去实现对应的算法。
抽象工厂模式
比如封装一个多数据源的访问。
- 新建一个接口,定义访问的方法。
- 然后各个数据库为其创建对应的类,实现该接口。
- 再定义一个工厂接口,实现对应对象创建的方法。
- 再定义几个类去实现该接口的方法。
- 可以实例化对应的工厂去使用。
单例模式
保证一个类只有一个实例,并且提供一个访问他的全局访问点。
- 将类成员变量设置为静态
- 私有化其他构造方法,只留一个构造,且内部进行判断,如果已经实例化,则直接返回。
- 且在成员变量加volatile关键字
- 实例化成员变量时内部加上synchronized锁,防止并发创建多个实例。
- 或者采用静态初始化
class Singleton{private static Singleton instance = new Singleton();private Singleton(){}public static Singleton getInstance(){return instance;}}
或者
class Singleton{private volatile static Singleton instance = new Singleton();private Singleton(){}public static Singleton getInstance(){if(instance==null){synchornized(Singleton.class){if(instance==null){instance=new Singleton();}}}return instance;}}
建造者模式
将一个复杂对象的构建和他的表示分离,同样的建造过程可以创建不同的表示
比如产品类
- 先写一个抽象建造者类,把抽象方法都定义好
- 然后写几个具体建造者类继承抽象类
- 然后指导者类,内部构造去写一个调用抽象类的创建人的各个方法。
可以实现客户并不知道具体的建造过程
原型模式
用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。
- 封装一个抽象类实现cloneable接口,重写clone方法。
- 创建具体原型类继承抽象类
结构型模式
适配器模式
将一个类的接口转换为客户需要的另一个接口。该模式使原本接口不兼容而不能一起工作的类可以一起工作。
- 首先定义两个接口
- 然后定义一个适配器类继承并重写其中方法,并且定义另一个类作为变量,在重写方法中用到。
装饰器模式
动态的给类添加一些额外的职责,就添加功能来说,该模式比生成子类更加灵活。
- 定义一个抽象类component
- concretecomponent类继承抽象类
- decorator继承了component的抽象类,可以从外部扩展component功能
- 定义具体装饰类继承decorator
代理模式
为其他对象提供一种代理以控制该对象的访问
- 定义一个抽象类或接口
- 定义一个具体实现类继承该类
- 再定义一个具体代理类,并在内部将上一个具体类作为成员变量
外观模式
为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,该接口使得该子系统更加容易使用。
- 定义四个子系统类
- 定义一个外观类,将四个子系统类全部实例化并写方法。
桥接模式
将抽象部分和实现部分相分离,使得他们可以独立的变化
- 定义一个抽象类
- 几个具体实现类
- 另一个抽象类 内部依赖第一个抽象类
- 具体类继承该抽象类
组合模式
将对象组合成树形结果表示部分-整体结构。使得用户对单个对象和组合对象的使用具有一致性。
- 定义一个component
- 定义两个子类leaf和composite
享元模式
运用共享技术有效的支持大量细粒度的对象
- 定义一个抽象类,几个具体类
- 再定义一个抽象工厂,内部依赖抽象类
行为型模式
策略模式
定义了算法策略,分别封装起来,让他们可以互相替换,不会影响到使用算法的客户。
- 定义一个算法抽象类
- 几个具体实现类
- 定义一个conext类,内部使用算法抽象类,实例化,并调用其的算法
模板方法模式
定义一个算法骨架,将一些步骤延迟到子类中,使得子类不需要改变算法结构就可以重新定义某个步骤
- 一个抽象类
- 几个实现类
观察者模式
定义了一种一堆多的关系,让多个观察者同时监听某个对象,该对象发生变化,会通知观察者对象去更新自己。
- 定义通知者抽象类接口,内部使用了观察者类
- 定义具体通知者
- 定义观察者抽象类接口,内部有更新方法
- 几个具体观察者类
迭代子模式
提供一种方法顺序访问一个聚合对象的各个元素,不暴露该对象的内部表示。
- 定义一个聚合抽象类
- 具体实现类
- 定义一个iterator迭代器抽象类
- 再定义一个具体类
- 就可以实现使用该迭代器去遍历具体聚合类
责任链模式
使多个对象都有机会去处理请求,从而避免请求的发送者和接收者的关系之前的耦合。将对象链接成一个链,并通过该链条传递该请求,直到有一个对象处理他。
- 定义一个父接口
- 实现多个子类,可以实现不同内容处理
- 通过链条方式将他们链接起来
- 先从底层开始处理
命令模式
将请求封装为对象,用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持撤销的操作。
- 定义一个命令接口,内部调用一个接收者类
- 定义接收者
- 定义具体命令类
- 定义invoker类,内部调用命令类
- 实例化接收者,实例化命令
- 实例化invoker,执行方法。
备忘录模式
在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存该状态,这样以后就可将该对象恢复到原先保存的状态。
- 发起人 调用备忘录
- 备忘录
- 管理类 管理备忘录
状态模式
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类
- 状态抽象类
- 几个具体状态类
- 一个上下文类
访问者模式
表示一个作用于某对象的元素的操作,他可以使在不改变元素情况下定义作用与这些元素的新操作
- 访问者
- 元素类
- 对象结构类
中介者模式
用一个中介来封装交互的动作。
- 定义一个抽象人 内部含中介
- 再定义两个具体人
- 然后定义一个中介
- 定义几个具体中介
- 通过实例化中介和人,给人设置相同中介就可以交互
解释器模式
给一个语言,定义他的一种表示,并定义一个解释器,用于解释
- 上下文类
- 抽象表达类
- 具体实现
推荐书籍:大话设计模式,清华出版社的,写的真的很不错!
相关文章:

Java设计模式(23种设计模式 重点介绍一些常用的)
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式,共十一种:…...

JVM(5):虚拟机性能分析和故障解决工具概述
1 工具概述 作为一个java程序员,最基本的要求就是用java语言编写程序,并能够在jvm虚拟机上正常运行,但是在实际开发过程中,我们所有的程序由于各种各样的原因,并不是总能够正常运行,经常会发生故障或者程序…...

vue3插槽solt 使用
背景增加组件的复用性,个人体验组件化还是react 方便。 Vue插槽solt如何传递具名插槽的数据给子组件? 一、solt 原理 知其然知其所以然 Vue的插槽(slots)是一种分发内容的机制,允许你在组件模板中定义可插入的内容…...

正则项学习笔记
目录 1. L2 正则化 岭回归 1.1 L2 norm计算例子 2. L1 正则化 3. 弹性网正则化 4. Dropout 1. L2 正则化 岭回归 在 PyTorch 中,L2 正则化通常通过设置优化器的 weight_decay 参数实现。以下是一个简单的例子: 介绍博文: 正则化(1)&a…...

Django自定义模板标签与过滤器
title: Django自定义模板标签与过滤器 date: 2024/5/17 18:00:02 updated: 2024/5/17 18:00:02 categories: 后端开发 tags: Django模版自定义标签过滤器开发模板语法Python后端前端集成Web组件 Django模板系统基础 1. Django模板语言概述 Django模板语言(DTL&…...

k8s集群安装后CoreDNS 启动报错plugin/forward: no nameservers found
安装k8s过程中遇到的问题: 基本信息 系统版本:ubuntu 22.04 故障现象: coredns 报错:plugin/forward: no nameservers found 故障排查: #检查coredns的配置,发现有一条转发到/etc/resolv.conf的配置…...

AI图片过拟合如何处理?答案就在其中!
遇到难题不要怕!厚德提问大佬答! 厚德提问大佬答8 你是否对AI绘画感兴趣却无从下手?是否有很多疑问却苦于没有大佬解答带你飞?从此刻开始这些问题都将迎刃而解!你感兴趣的话题,厚德云替你问,你解…...

0基础如何进入IT行业
目录 引言 一、了解IT行业 1.1 IT行业概述 1.2 IT行业的职业前景 二、选择适合的学习路径 2.1 自学 2.2 参加培训班 2.3 高等教育 三、学习基础技能 3.1 编程语言 3.2 数据结构与算法 3.3 计算机基础知识 四、实践与项目经验 4.1 开源项目 4.2 个人项目 4.3 实习…...

一键批量提取TXT文档前N行,高效处理海量文本数据,省时省力新方案!
大量的文本信息充斥着我们的工作与生活。无论是研究资料、项目文档还是市场报告,TXT文本文档都是我们获取和整理信息的重要来源。然而,面对成百上千个TXT文档,如何快速提取所需的关键信息,提高工作效率,成为了许多人头…...

Java-常见面试题收集(十六)
二十五 RocketMQ 1 消息队列介绍 消息队列,简称 MQ(Message Queue),它其实就指消息中间件,当前业界比较流行的开源消息中间件包括:RabbitMQ、RocketMQ、Kafka。(一个使用队列来通信的组件&…...

vue从入门到精通(四):MVVM模型
一,MVVM MVVM(Model–view–viewmodel)是一种软件架构模式。MVVM有助于将图形用户界面的开发与业务逻辑或后端逻辑(数据模型)的开发分离开来。详见MVVM 二,Vue中的MVVM Vue虽然没有完全遵循 MVVM 模型,但是 Vue 的设…...

提供一个c# winform的多语言框架源码,采用json格式作为语言包,使用简单易于管理加载且不卡UI,支持“语言分级”管理
提供一个c# winform的多语言框架源码,采用json格式作为语言包,不使用resx资源,当然本质一样的,你也可以改为resx 一、先看下测试界面 演示了基本的功能:切换语言,如何加载语言,如何分级加载语…...

Docker常见命令
创建并运行容器 例子:docker安装运行mysql docker run -d \ --name mysql \ -p 3306:3306 \ -e TZAsia/Shanghai \ -e MYSQL_ROOT_PASSWORDroot \ -v /root/data/mysql/data:/var/lib/mysql \ -v /root/data/mysql/init:/docker-entrypoint-initdb.d \ -v /root/d…...

中科大6系+先研院+中南大学电子信息学院2023年保研经历
中科大6系 英语口语问题: What’s your research plan?Please introduce your project. 专业课问题: BPSK和QPSK每个字母代表的含义?QAM的星座图是什么样的?根据什么准则画成那个样子? 中科大先研院 …...

分布式理论--BASE
目录 是什么BASE 与 CAP,ACID 的区别BASE 和 Paxos 类共识算法的区别相关问题 是什么 BASE 理论是对 CAP 理论的进一步扩展主要强调在分布式系统中,为了获得更高的可用性和性能,可以放宽对一致性的要求,是对 CAP 中 AP 方案的一个…...

【计算机网络原理】浅谈应用层协议的自定义和传输层UDP协议的总结
˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…...

正则表达式及其应用
demo1: package 正则表达式;public class demo1 {public static void main(String[] args) {//只能是a b cSystem.out.println("a".matches("[abc]"));//true//前后校验字符个数需要一致System.out.println("ab".matches("[abc]"));/…...

VUE面试题(3)--vue常见面试题
1.vue优点 低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。 可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。 …...

2024.05.24|生信早报【AI测试版】
植物再生领域重大突破 山农大团队发现植物“再生指挥官”REF1:中国科学院院士种康高度评价,认为这一发现对细胞分化与再生领域的基础科学研究和生物技术应用具有重大意义。 生物医药专业园区建设\n- 卫光生命科学园聚焦合成生物学、脑科学:…...

计算机毕业设计 | springboot药品库存追踪与管理系统 药店管理(附源码)
1,绪论 1.1 背景调研 如今药品调价频繁,且品种繁多,增加了药品销售定价的难度。药品来货验收登记中的审查有效期环节容易出错,错收过期或有效期不足的药品。 手工模式下的药品库存难以及时掌握,虽然采取了每日进行缺…...

Flink 对接 Hudi 查询数据,java代码编写
1.pom.xml文件需要引入下面包 <properties><flink.version>1.15.4</flink.version><hudi.version>0.13.1</hudi.version></properties><dependencies><dependency><groupId>org.apache.flink</groupId><artifa…...

计算机操作系统总结(1)
1操作系统的概念(定义)功能和目标 (1)什么是操作系统? (2)操作系统的功能和目标—作为系统资源的管理者 (3)操作系统的功能和目标—向上层提供方便易用的服务 (4)操作系…...

HTML5好看的通用网站模板源码
文章目录 1.设计来源1.1 主界面1.2 模板菜单1 界面1.3 模板菜单2 界面1.4 模板菜单3 界面1.5 下拉菜单1 界面1.6 下拉菜单2 界面1.7 模板菜单4 界面1.8 模板菜单5 界面1.9 界面底部 2.效果和源码2.1 动态效果2.2 源码目录2.3 源代码 源码下载 作者:xcLeigh 文章地址…...

AWS安全性身份和合规性之Inspector
Amazon Inspector 是一项漏洞管理服务,可持续扫描您的 AWS 工作负载,以查找软件漏洞和意外网络泄露。Amazon Inspector 会自动发现和扫描正在运行的亚马逊 EC2 实例、亚马逊弹性容器注册表 (Amazon ECR) Container Registry 中的容器映像,以及…...

mybatis plus 配置多数据源(数据源进行切换)
多数据源(数据源进行切换) AbstractRoutingDataSource 根据用户定义的规则选择当前的数据源,这样我们可以在执行查询之前,设置使用的数据源。实现可动态路由的数据源,在每次数据库查询操作前执行。它的抽象方法 determineCurrentLookupKey()…...

Docker-Android安卓模拟器本地部署并实现远程开发测试
文章目录 1. 虚拟化环境检查2. Android 模拟器部署3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问小结 6. 固定Cpolar公网地址7. 固定地址访问 本文主要介绍如何在Ubuntu系统使用Docker部署docker-android安卓模拟器,并结合cpolar内网穿透工具实现公网远程访问本地…...

vue-封装上下(垂直方向)轮播
需求:没有找到特别好的上下轮播插件-所以自己写了一个简单的demo 一.上下平滑轮播-移入停止-移出继续轮播 <!--* 消息滚动 --> <template><div class"news"><div id"roll" class"InfoBox" mouseover"thi…...

海外私人IP和原生IP有什么区别,谁更有优势?
一、什么是海外私人IP?什么是原生IP? 1、海外私人IP: 海外私人IP是由专门的服务提供商提供的IP地址,这些IP地址通常与特定地理位置或国家相关联。这些IP地址独享私人而不用与其他用户共享。海外私人IP广泛应用与跨境电商中&#x…...

主流容器工具对比以及重点推荐学习的企业级工具
常见的主流容器工具包括但不限于以下几种: 1. Docker: Docker 是最流行的容器平台之一,它允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中,然后可以在任何支持Docker的系统上运行。 2. Kubernetes:Kubern…...

国产linux系统(银河麒麟,统信uos)使用 PageOffice 国产版在线编辑word文件,同时保存数据和文件
PageOffice 国产版 :支持信创系统,支持银河麒麟V10和统信UOS,支持X86(intel、兆芯、海光等)、ARM(飞腾、鲲鹏、麒麟等)芯片架构。 在OA办公、文档流转等各个Web系统中,实现最简单的…...