线性数据结构:链表
链表 Link List一、链表数据结构在计算机科学中,链表是数据元素的线性集合,元素的线性顺序不是由它们在内存中的物理地址给出的。它是由一组节点组成的数据结构,每个元素指向下一个元素,这些节点一起,表示线性序列。在最简单的链表结构下,每个节点由数据和指针(存放指向下一个节点的指针)两部分组成,这种数据结构允许在迭代时有效地从序列中的任何位置插入或删除元素。
链表的数据结构通过链的连接方式,提供了可以不需要扩容空间就更高效的插入和删除元素的操作,在适合的场景下它是一种非常方便的数据结构。但在一些需要遍历、指定位置操作、访问任意元素的操作下,需要循环遍历,这将导致时间复杂度的提升。
简而言之就是链表的插入删除,直接操控节点,时间复杂度低,但是查询的操作需要遍历链表,时间复杂度高。
二、链表分类类型链表的主要类型有:单向链表、双向链表、循环链表。
1、单向链表单向链表包含具有数据字段的节点以及指向节点行中的下一个节点的“下一个字段”,可以对单链表执行的操作包括插入、删除、遍历。
2、双向链表在双向链表中,除了下一个节点链接之外,每个节点还包括指向序列中“前一个”节点的第二个链接字段。这两个 ...
docker指令以及详解
什么是DockerfileDockerfile适用于构建Docker容器镜像的文本文件,它包含了一系列指令和配置,用于描述如何组装一个Docker容器的环境。
通过Dockerfile,你可以自动化地构建镜像,确保在不同的环境中都可以复现相同的容器。
Dockerfile中的指令可以指定从哪个基础镜像开始构建、复制文件到镜像中、安装软件包、设置环境变量、暴露端口、运行命令等等。
每个指令都会在镜像的构建过程中构建一个新的镜像层,这些曾构成了最终镜像的结构。
这种分层结构让镜像的构建更加高效,同时也方便了镜像的复用和共享。
以下是一个简单的Dockerfile实例:
# 使用官方的 Python 3 基础镜像FROM python:3# 将当前目录下的文件复制到镜像中的 /app 目录COPY . /app# 设置工作目录WORKDIR /app# 安装依赖包RUN pip install -r requirements.txt# 暴露容器监听的端口EXPOSE 80# 定义容器启动时运行的命令CMD ["python", "app.py"]
以上 ...
java-design结构型模式第六节享元模式
结构型模式包括:适配器、桥接、组合、装饰器、外观、享元、代理这类模式介绍如何将对象和类组装成较大的结构,并同时保持结构的灵活和高效。第七节、代理模式一、代理模式介绍代理模式有点像老大和小弟。主要解决的问题是为某些资源的访问、对象的类的易用操作上提供方便使用的代理服务。而这种设计模式经常会出现在我们的系统中。
类似的场景有:
数据库访问层面经常会提供一个较为基础的应用,以此来减少应用服务扩容时不至于数据库连接数暴增。
使用过的一些中间件:RPC框架,在拿到jar包对接口的描述后,中间件会在服务启动的时候生成对应的代理类,当调用接口的时候,实际是通过代理类发出的socket信息进行通过。
mybatis:基本是定义接口但是不需要写实现类,就可以对xml或者自定义注解里的sql语句进行增删改查操作。
二、案例场景模拟在本案例中我们模拟实现mybatis-spring中代理类生成部分
对于Mybatis的使用中只需要定义接口不需要实现类就可以完成增删改查操作,这是中间件开发的思想,只做业务开发对于spring的bean的定义一级注册和对代理以及反射调用的知识了解的相对较少。
三、代理类模式 ...
java-design结构型模式第六节享元模式
结构型模式包括:适配器、桥接、组合、装饰器、外观、享元、代理这类模式介绍如何将对象和类组装成较大的结构,并同时保持结构的灵活和高效。第六节、享元模式一、享元模式介绍
享元模式,主要在于共享通用对象,减少内存的使用,提升系统的访问效率。而这部分共享对象通常比较耗费内存或者需要查询大量接口或者使用数据库资源,因此统一抽离作为共享对象使用。
另外享元模式可以分为在服务端和客户端,⼀般互联⽹H5和Web场景下⼤部分数据都需要服务端进⾏处理,⽐如数据库连接池的使⽤、多线程线程池的使⽤,除了这些功能外,还有些需要服务端进⾏包装后的处理下发给客户端,因为服务端需要做享元处理。但在⼀些游戏场景下,很多都是客户端需要进⾏渲染地图效果,⽐如;树⽊、花草、⻥⾍,通过设置不同元素描述使⽤享元公⽤对象,减少内存的占⽤,让客户端的游戏更加流畅。
在享元模型的实现中需要使用到享元工厂来进行管理这部分独立的对象和共享的对象,避免出现线程安全问题。
二、案例场景模拟
在这个案例中我们模拟在商品秒杀场景下使用享元模式查询优化
商品下单的项目从日均十几单到某个时段秒杀量破十万的项目。需要使用redis的分布式锁来控制商品库 ...
java-design结构型模式第五节外观模式
结构型模式包括:适配器、桥接、组合、装饰器、外观、享元、代理这类模式介绍如何将对象和类组装成较大的结构,并同时保持结构的灵活和高效。第五节、外观模式一、外观模式介绍外观模式也叫门面模式,主要解决的是降低调用方的使用接口的复杂逻辑组合。这样调用方与实际的接口提供方提供了一个中间层,用于包装逻辑提供API接口。有些时候外观模式也被用在中间层,对服务中的通用性复杂逻辑进行中间件层包装,让使用方可以只关心业务开发。
这样的模式也常见: 比如以前注册账号需要填写很多信息,现在注册账号只需要使用手机号或者微信一键登录
二、案例场景模拟在本案例中我们模拟一个将所有服务接口添加白名单的场景。
⼀般情况下对于外观模式的使⽤通常是⽤在复杂或多个接⼝进⾏包装统⼀对外提供服务上,此种使⽤⽅式也相对简单在我们平常的业务开发中也是最常⽤的。你可能经常听到把这两个接⼝包装⼀下,但在本例⼦中我们把这种设计思路放到中间件层,让服务变得可以统⼀控制。
1.场景模拟工程
这是一个SpringBoot的HelloWorld工程,在工程中提供了查询用户信息的接口HelloWorldController.queryUserInf ...
java-design结构型模式第四节装饰器模式
结构型模式包括:适配器、桥接、组合、装饰器、外观、享元、代理这类模式介绍如何将对象和类组装成较大的结构,并同时保持结构的灵活和高效。第四节、装饰器模式一、装饰器模式介绍装饰器的核心就是在不改变原有类的基础上给类新增功能。不改变原有类,也可以使用继承、AOP切面。但是装饰器模式可以避免继承导致的子类过多,也可以避免AOP带来的复杂性。
很多场景都用到装饰器模式,比如学习java开发的字节流、字符流、文件流的内容时,一层嵌套一层的方式。
new BufferedReader(new FileReader(“”));
二、案例场景模拟在本案例中我们模拟一个单点登录功能扩充的场景⼀般在业务开发的初期,往往内部的ERP使⽤只需要判断账户验证即可,验证通过后即可访问ERP的所有资源。但随着业务的不断发展,团队⾥开始出现专⻔的运营⼈员、营销⼈员、数据⼈员,每个⼈员对于ERP的使⽤需求不同,有些需要创建活动,有些只是查看数据。同时为了保证数据的安全性,不会让每个⽤户都有最⾼的权限。
那么以往使⽤的 SSO 是⼀个组件化通⽤的服务,不能在⾥⾯添加需要的⽤户访问验证功能。这个时候我们就可以使⽤装饰器模式, ...
java-design结构型模式第三节组合模式
结构型模式包括:适配器、桥接、组合、装饰器、外观、享元、代理这类模式介绍如何将对象和类组装成较大的结构,并同时保持结构的灵活和高效。第三节、组合模式一、组合模式介绍通过一对的连接组织出一颗结构树。而这种通过把相似对象(也可以称为方法)组合成一组可被调用的结构树对象的设计思路叫做组合模式。这种设计模式可以让服务组节点进行自由组合对外提供服务,例如你有三个原⼦校验功能( A:身份证 、 B:银⾏卡 、 C:⼿机号 )服务并对外提供调⽤使⽤。有些调⽤⽅需要使⽤AB组合,有些调⽤⽅需要使⽤到CBA组合,还有⼀些可能只使⽤三者中的⼀个。那么这个时候你就可以使⽤组合模式进⾏构建服务,对于不同类型的调⽤⽅配置不同的组织关系树,⽽这个树结构你可以配置到数据库中也可以不断的通过图形界⾯来控制树结构
二、案例场景模拟以上是一个非常简化版的营销规则决策树,根据性别,年龄来发放不同类型的优惠券,来刺激消费起到精准用户促活的目的。
三、直接实现1.工程结构
2.代码实现public class EngineController { private Logger logger = LoggerFa ...
java-design结构型模式第二节桥接模式
结构型模式包括:适配器、桥接、组合、装饰器、外观、享元、代理这类模式介绍如何将对象和类组装成较大的结构,并同时保持结构的灵活和高效。桥接模式一、桥接模式介绍桥接模式的主要作用就是通过将抽象部分与实现部分分离,把多种可匹配的使用进行组合。
核心实现也就是在A类中含有B类接口,通过构造函数传递B类的实现,这个B类就是设计的桥
开发使用场景:jdbc多种驱动程序的实现、同品牌类型的台式机和笔记本平板、业务实现中的多类接口同组过滤服务等。
二、案例场景模拟模拟第三方平台,将市面上的支付服务集中到自己的平台,再把这样的平台提供给用户,同时支持人脸、扫描、密码多种方式。多支付与多模式的融合使用
三、直接实现1.工程结构
2.代码实现public class PayController { private Logger logger = LoggerFactory.getLogger(PayController.class); public boolean doPay(String uId, String tradeId, BigDecimal amount, int chan ...
java-design结构型模式第一节适配器模式
结构型模式包括:适配器、桥接、组合、装饰器、外观、享元、代理这类模式介绍如何将对象和类组装成较大的结构,并同时保持结构的灵活和高效。第一节、适配器模式一、适配器模式介绍适配器模式的主要作用就是把原来不兼容的接口,通过适配修改做到统一,使得用户方便使用。在业务开发中我们会经常的需要做不同接口的兼容,尤其是中台服务,中台需要把各个业务线的各种类型服务做统一包装,再对外提供接口进行使用。
二、案例场景模拟随着公司的业务的不断发展,当基础的系统逐步成型以后。业务运营就需要开始做⽤户的拉新和促活,从⽽保障 DUA(日活跃用户数量) 的增速以及最终 ROI(投资回报率) 转换。
⽽这时候就会需要做⼀些营销系统,⼤部分常⻅的都是裂变、拉客,例如;你邀请⼀个⽤户开户、或者邀请⼀个⽤户下单,那么平台就会给你返利,多邀多得。同时随着拉新的量越来越多开始设置每⽉下单都会给⾸单奖励,等等,各种营销场景。
那么这个时候做这样⼀个系统就会接收各种各样的MQ消息或者接⼝,如果⼀个个的去开发,就会耗费很⼤的成本,同时对于后期的拓展也有⼀定的难度。此时就会希望有⼀个系统可以配置⼀下就把外部的MQ接⼊进⾏,这些MQ就像上 ...
java-design第五节单例模式
创造者模式:工厂方法、抽象工厂、生成器、原型、单例这类模式提供创建对象的机制,能够提升已有代码的灵活性和可复用性单例模式这是五个创建型模式中的最后一个。
在设计模式中按照不同的处理方式共包含三大类:创建型模式、结构性模式和行为模式
一、单例模式介绍单例模式主要解决的是:一个全局使用的类频繁的创建和消费。
二、案例场景日常开发可见:
数据库的连接池不会反复创建。
spring中的一个单例模式bean的生成和使用。
在我们平常的代码中需要设置全聚德一些属性保存。
三、7种单例模式的实现单例模式的实现方式较多,主要在实现上是否支持懒汉模式、是否线程安全中运用各项技巧。
0.静态类使用package org.levtio.demo.design;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;/** * @Author: LuoMingDong * @Date: 2023/9/21 13:54 * @Describe: 静态类使用 */public class Singleton_00 { ...