自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(45)
  • 问答 (1)
  • 收藏
  • 关注

原创 设计模式-装饰模式

就在前几天,国家又出台了房地产政策,以促进那些有钱人买房。买房已经成为社会上一个热门话题,在中国人的心理,买房可是像成家立业一样的大事。那买房就能住吗?买房之后要达到人住的条件还需要进行装修。房屋装修又是一笔不菲的开销,花大价钱购买的房子那可得好好思考下装修相关事宜。自己肯定研究不明白,就去找装修公司。看到了吧,购买的房子如果想要达到居住的目的,还需要选择性的进行装修才行,除非你喜欢叙利亚风格。生活中像这样需要额外再投入使用的产品还有很多。再比如说购买奶茶时,你还可以选择多加波波,少加糖,少加冰等选项。

2023-09-19 22:40:32 171

原创 设计模式-责任链模式

单一职责原则”要求一个类仅负责的一个不可分业务逻辑,但这并不意味着能够实现这部分业务逻辑的只能有一个类,业务逻辑可能是会因运行时数据而选择不同类。比如在日常工作中,请假审批可能受请假天数、请假类型等因素影响,而须由不同领导来负责审批。再比如在银行取钱时,取钱业务审批申请可能会受到你所取钱总数、存储类型等因素影响,而须由不同经理或职员来负责办理。这一类事情其实在代码世界中更加常见,比如参数校验可能受到请求类型、请求数据的不同而由不同类(订单接口包括用户风控校验、限购校验、门店合法性、商品合法性等)来负责。

2023-09-17 22:47:21 704

原创 设计模式-命令模式

小度,小度,热死了请打开空调~”,“小度,小度,主人回家了~”,“小度,小度,播放一首炸雷~”,像小度类似的智能产品正在逐步改善我们的生活,只要我们一声令下,产品立马执行,毫不拖延。就如同老板的命令一样,系统需接收到命令后经过一系列分析后,会自动选择执行哪些命令,而发令者完全不关心内部是执行了哪些动作以及哪个具体方法。比如“小度的主人回家了”,小度内部接受到指令后会自动分析出需要打开灯光,打开窗帘,打开中央空调,播放一首著名的萨克斯独奏-回家以及检查房门是否已关闭等内容。

2023-09-17 15:55:51 361

原创 设计模式-中介者模式

每次乘坐高铁出行时,我都会像这样一个问题:这么多列车都可能通过这条轨道,会不会存在冲突的可能呢?,同样的,飞机的起飞和降落时对于道路的选择也会有冲突的可能。这些情况都会造成可怕的后果, 而阻止这种情况发生的就是机场调度中心。飞机在起飞和降落前都会请求机场调度中心,由机场调度中心来负责协调飞机、地面道路、摆渡车辆等。因此,机场调度中心就属于机场的总指挥,会统一协调各单位的运行状态,使得飞机能够安全、顺利起飞和降落。我们试想以下,如果没有机场调度中心的话,飞机在起飞时如何判断应该从哪个通道加速、起飞呢?

2023-09-17 01:07:35 379

原创 设计模式-原型模式

相信很多同学小时候都玩过《超级马里奥》这款游戏,不知道你是否还记得你曾经营救过的公主?你们在一起了吗?哈哈!小时候我家可没这个条件,经常跑到同学家里玩(或者看别人玩),可羡慕死我了。小的时候只知道玩,长大后才知道原来这么多关卡的马里奥竟然只占用40KB,我现在随手拍张照片也有个5MB左右呀!后来经过查阅资料才知道其中的道道:基本原理就如上所示,当然游戏内部还有一些其他优化措施,有兴趣的同学自行查阅。

2023-09-16 16:48:46 604

原创 设计模式-代理模式

组合和继承。从是否编译器确定代理类角度上看分为静态代理和动态代理。而其中动态代理的实现机制不同可分为JDK动态代理和CGLIB动态代理。在实际使用场景中,我们必须清楚的知道在什么场景下应该选用什么样的代理模式。

2023-09-14 22:57:40 464 1

原创 CGLIB原理简析-后篇

AbstractClassGenerator是cglib包下所有与类字节码生成相关工具类的抽象类。AbstractClassGenerator实际上是一个模版模式,动态生成类字节码的过程封装在create()方法中,并其中提供了许多钩子函数以及供子类实现的基本方法,如自定义类加载器,自定义生成类的类名。除此之外,AbstractClassGenerator还设计了缓存用于提升类字节码生成的效率。

2023-08-18 21:39:20 420

原创 CGLIB原理简析-前篇

回到最初的问题,当我们调用代理对象的对应方法时如何实现代理的?我们先回顾下JDK动态代理。JDK动态代理也是会生成并实例化一个代理类,该代理类继承的父类为Proxy类,且实现了接口下的所有方法。同样的,因为是运行时生成的代理类,代理对象一定是通过接口引用的多态对象存在。当代理对象调用任何接口方法时,其内部逻辑都会调用InvocationHandler对象(仅一个)的invoke方法进行调用。因此,使用者可以自定义InvocationHandler对象,在invoke方法中实现对指定对象的代理。

2023-08-13 02:23:16 422

原创 JDK动态代理原理

可以看出,只要给出要实现类的加载器、接口列表就能够在运行时创建出代理类。代理类的实例化需要传入自定义的调用处理器实例,具体代理的内容均在处理器实例中体现。JDK动态代理在使用上十分简单,但内部具体实现逻辑有很多细节指的我们探索。下文将先从目标代理类入手,分析其结构和调用关系。然后分析Proxy中探索生成代理类的过程。

2023-08-07 22:48:37 272

原创 ProxyGenerator-代理类生成器

ProxyGenerator是JDK-sun包下提供的用于生成动态代理类信息的类,其唯一向外透出的是其静态方法-(…)。学习本篇文章,就是想学习ProxyGenerator如何生成代理类信息的过程。

2023-08-06 21:28:47 518

原创 补充JDK源码-IDEA集成工具

在阅读JDK8源码的时候发现,只有一小部分常用包是存在源码及其注释的,而很多内部包是没有源码,class文件在阅读的时候对阅读者十分不友好。在网上搜集了很多资料都没有解决问题。。本文主要是根据这篇文章记录下解决过程。(本来不想重写一遍,但是网上太多教程根本无法解决这个问题)

2023-08-02 22:04:56 742

原创 WeakCache二级缓存

这问题就来了,在这个map进行hash时是按照Supplier实例进行的,但是Supplier实际上仅是我们对V类型值的延迟封装,真正hash应该按照value值进行,即我们不关心Supplier对value封装的具体形式,只要是supplier1.get()== supplier2.get()也认为是同一个value。二级缓存的结构为,其中Key和Value均为弱引用,而Sub-Key为强引用。在JDK动态代理中,用于缓存已经生成的代理类的class对象。

2023-07-31 11:45:47 511

原创 设计模式-建造者模式

在前面几篇文章中,已经讲解了单例模式、工厂方法模式、抽象工厂模式,创建型还剩下一个比较重要的模式-建造者模式。在理解该模式之前,我还是希望重申设计模式的初衷,即。学习设计模式遗忘其初衷,注定无法理解其真正的深刻内涵。从创建型模式的名称上来看,这些都是为了解决创建对象相关的问题。单例模式解决了如何创建唯一对象的问题,工厂方法模式解决了对象创建过程的封装问题,抽象工厂模式解决了创建多个相关联对象的问题,那么不知道你之前是否有思考过,建造者模式是要解决什么问题吗?

2023-07-29 17:27:24 795

原创 设计模式-模版方法模式

生活中处处存在模版,模版定义了大的框架,具体内容由使用者填充即可,这给很多人的生活、工作带来了很大的遍历。你也可以想象生活中处处可见的其他“模版”,这是一个标准化的过程。在开发技术栈中,spring、mybatic等框架其实也是模版的体现,通过标准化模版式的约定简化开发成本,提升开发效率。因此,我们该怎么通过面向对象语言来体现这种标准化的过程(模版)呢?答案就是模版方法模式。

2023-07-26 23:32:25 410 1

原创 设计模式-抽象工厂模式

在经济学领域中,其主要研究对象(商品)之间根据消费依存关系可分为互补商品或替代商品,其中,互补商品如汽车与汽油、自行车与自行车胎、大饼和香肠、开水和泡面等。在面向对象的代码世界中,不同对象之间也存在这种类似相互依赖的关系【注:这种关系非指定为上面互补关系】,比如特斯拉汽车与新能源、奔驰汽车与92汽油、拖拉机与柴油,这种依赖关系是具有明显的依赖关系的。这意味着如果用户(客户端)获取的汽车对象种类不同,也意味着其所需要的能源种类也存在不同。思考这样一个问题,

2023-07-23 19:12:41 449

原创 设计模式-工厂方法模式

基于面向对象语言开发中,免不得需要创建对象。前面讲解的"单例模式"也是如此,不过是要创建唯一的对象。本文要讲述“工厂方法模式”是要封装创建对象的过程。工厂,也称之为“制造厂”,用于创建具体的产品直接提供给外界使用。其实,这就是对产品的创建过程的封装,外界需要产品,那就通过工厂提供的途径获取。反映到代码世界中,如果对象的创建过程复杂,时,我们可不通过一个“工厂”来封装这个过程呢。工厂的具体代码表现形式要看封装的粒度。这里。这二者也分别代表着。

2023-07-23 16:06:41 272

原创 设计模式-单例模式进阶

在前面的文章(设计模式-单例模式)中,我们分别介绍了四种单例设计模式,包括普通恶汉式单例、双重检查锁单例(DCL)、静态内部类单例以及枚举单例。但是,这四种模式还有一些问题我们没有仔细分析,以至于我们无法深入分析他们的优点以及可能存在的问题,更无法确定我们应该在什么场景下使用,在使用的时候我们有应该注意哪些方面。这些重要问题包括如下(但肯定不止,欢迎读者评论补充):在普通饿汉式单例以及静态内部类单例,我们都利用JVM在并发加载类时肯定只会加载一次的特性,来保证单例对象有且仅有一次初始化动作。那有个问题是JV

2023-07-20 22:53:48 356

原创 设计模式-单例模式

面向对象语言讲究的是万物皆对象。通常流程是先定义可实例化类,然后再通过各种不同的方式创建对象,因此类一般可以实例化出多个对象。但是实际项目开发时,我们还是希望保证项目运行时有且仅包含一个实例对象。这个需求场景的出发点包括但不限于以下几个方面:数据源对象(创建连接池、权限验证等均十分消耗资源)、线程池对象(同一个线程池)、日志对象(防止日志覆盖)等等。

2023-07-15 09:10:54 862

原创 设计模式-迪米特法则

代码世界中类间的耦合关系会直接影响代码可复用性、可读性、可扩展性等。这种耦合关系就如同人之间朋友关系一样,志不同道不合不应相于谋,否则最终只会落得个互相伤害的下场。代码组织时也应如此,应按照一定的原则处理好类之间的关系,否则就会导致恶性耦合只会使得项目代码越写越烂,难以维护。这个原则就是迪米特原则。

2023-07-09 08:55:55 634

原创 设计原则-依赖倒置原则

如同人体结构一样,项目代码也是需要有结构的,如原子逻辑块(不可再分代码块)、方法、类、模块等。结构要么是由成熟的框架搭建起来,要么自己手动划分,但是都需要。注意:这里所说的模块和项目代码结构中不完全一样,这里可以至结构中各个部分,比如原子逻辑块、方法等。按照生活的正常逻辑来说,上层模块依赖于下层模块(即,“依赖正置”)是没问题的,下层模块实现的功能就是提供给上层模块使用。但是由于需求的不断变化,下层模块功能的变动可能会影响到上层模块,继而导致整体功能的不可用。为解决这个问题,项目的各模块之间需遵循。

2023-07-08 23:26:20 779

原创 设计模式-接口隔离原则

一般的系统设计都需要系统设计架构图,图中会将系统整体按照几个不同维度的模块进行拆分,以达到模块之间高内聚、低耦合的效果,协同完成系统的各项功能。同样,在应用程序设计的时候,我们也需要对模块、接口进行拆分,这种拆分的依据(原则)就是接口隔离原则。

2023-06-10 17:46:59 1509

原创 设计原则-里氏替换原则

凡事皆有利弊,面向对象设计语言通过提供继承、多态等机制使得项目代码更具有复用性、可扩展性等优点,但是这些机制也存在一定的使用风险,比如继承的滥用、多态实现的不确定性等问题都有可能会引起重大线上事故。

2023-06-04 16:47:13 824

原创 设计原则-开闭原则

世界上没有任何一个项目是不需要迭代的,随着项目的发展壮大,会有越来越多的功能代码会被修改、添加、删除。据统计线上的生产事故90%都有由于变更引起的,因此为保证项目的迭代稳定性,我们需尽可能的遵守开闭原则。那开闭原则到底是什么?开和闭如何矛盾而统一呢?实际开发中该原则是否可执行?又该如何应用呢?

2023-05-27 19:17:51 986

原创 设计原则-单一职责原则

在编程大环境中,评价代码组织方式质量的好坏涉及到各个方面,如代码的可读性、可维护性、可复用性、稳定性等各个方面。设计原则(SOLID)也是在这些方面可能出现的问题中总结出来的,虽然并不一定能够全部都满足原则要求,但是尽可能满足更能够提到代码组织质量。本文下面将逐步分析单一职责原则的具体含义以及应用。

2023-05-21 16:07:38 962

原创 讲讲设计模式

学习设计模式随笔

2023-05-20 17:33:36 538

原创 Docker下部署FTP服务器

Docker下部署FTP服务器一、拉取镜像信息二、生成容器对象三、设置用户四、测试一、拉取镜像信息 docker pull fauria/vsftpd二、生成容器对象 docker run -d -p 20:20 -p 21:21 -p 21100-21110:21100-21110 -v /Ftpfile:/home/vsftpd -e PASV_ADDRESS=192.168.0.7 -e PASV_MIN_PORT=21100 -e PASV_MAX_PORT=21110 --name vs

2020-09-19 22:30:31 278

原创 Docker安装(Centos6.8)

Centos6.8安装Docker一、Centos6.8安装顺序二、Centos7查看官网步骤一、Centos6.8安装顺序yum install -y epel-releaseyum install https://get.docker.com/rpm/1.7.1/centos-6/RPMS/x86_64/docker-engine-1.7.1-1.el6.x86_64.rpmvi /etc/sysconfig/docker DOCKER_CERT_PATH=/etc/dockerdocker

2020-09-19 19:44:55 236

原创 Linux升级内核

Linux升级内核一、查看linux内核版本二、安装ELRepo到CentOS一、查看linux内核版本 uname -r二、安装ELRepo到CentOS导入public key rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org执行安装命令 rpm -Uvh http://www.elrepo.org/elrepo-release-6-8.el6.elrepo.noarch.rpm安装kernel-lt

2020-09-19 15:32:07 154

原创 Nat方式下宿主机无法ping通虚拟机

Nat方式下宿主机无法ping通虚拟机一. 正常操作步骤二. 其他一. 正常操作步骤虚拟机联网查看虚拟机IP地址查看虚拟机网卡设置或路由表网卡设置:路由表:4. 查看宿主机VM85. 此时按理宿主机就能够ping通虚拟机了二. 其他这个原因我是通过重启VMnet8网卡解决的。...

2020-09-18 22:02:32 588

原创 Pycharm连接远程服务器

Pycharm连接远程服务器1. 配置deployment1.1 新建配置1.2 连接远程服务器1.3 设置目录映射2. 配置远程解释器3. 同步文件3.1 自动同步3.2 手动同步1. 配置deployment1.1 新建配置首先配置 Pycharm 服务器的代码同步,打开 Tools -> Deployment -> Configuration,点击左边的 + 添加一个部署配置,输入配置名,Type 选择 SFTP,然后确认。1.2 连接远程服务器配置远程服务器的 IP(Host)

2020-08-01 11:36:21 537

原创 Pytorch:Conv2d卷积前后尺寸

Pytorch卷积前后的尺寸大小1. Conv2d参数2. 尺寸变化3. 示例1. Conv2d参数2. 尺寸变化卷积前的尺寸为(N,C,W,H) ,卷积后尺寸为(N,F,W_n,H_n)W_n = (W-F+S+2P)/S 向下取整H_n = (H-F+S+2P)/S3. 示例# m = nn.Conv2d(16, 33, 3, stride=2)# non-square kernels and unequal stride and with paddingm = nn.Conv2d

2020-08-01 10:19:00 3769

原创 Pythond的调试:Debugging

Python的调试:Debugging1. 运行方式1.1 从命令行运行1.2 从脚本内部运行2. 常用命令利⽤好调试,能⼤⼤提⾼你捕捉代码Bug的。⼤部分新⼈忽略了Python debugger(pdb)的重 要性。1. 运行方式1.1 从命令行运行python -m pdb my_script.py这会触发debugger在脚本第⼀⾏指令处停⽌执⾏。这在脚本很短时会很有帮助。你可以通 过(Pdb)模式接着查看变量信息,并且逐⾏调试。1.2 从脚本内部运行你也可以在脚本内部设置断点,这样就

2020-07-21 18:09:08 373

原创 Python的魔法变量

Python中的*args和**kwargs1. 写在前面2. *args2.1 作为定义函数的形参2.2 作为调用函数的实参3. **kwargs3.1 作为定义函数的形参3.2 作为调用函数的实参4. *args与**kwargs的调用顺序1. 写在前面首先需要说明的是,星号及星号的个数是必须的,而后面的变量名确实可以任意选取的。2. *args*args表示的是整合或解构可变长度的列表或元组,它的用法可以用于定义函数时的形参或者调用函数的实参。两种用法刚好互逆2.1 作为定义函数的形参当*

2020-07-21 16:43:22 623

原创 Python3.8安装Pytorch

Python3.8安装Pytorch的过程1. 错误来源2. 解决办法--安装torch/torchvision2.1 下载.whl文件2.2 安装2.3 检查1. 错误来源安装Pytorch应该使用官网提供的方式安装。但是由于实在运行速度太慢,我便使用清华源进行安装: pip3 install torch torchvision -i https://pypi.tuna.tsinghua.edu.cn/simple报错:No module named ‘tools.nnwrap’个人觉得是由

2020-07-18 01:00:12 12874

原创 LSTM:利用LSTM进行序列预测

文章目录1. 命令行参数解析2. K折验证3. 数据准备4. 模型准备5. 训练函数6. 测试函数1. 命令行参数解析main.py:if __name__ == '__main__': parser = argparse.ArgumentParser(description="Run LSTM(LSTM Network)") parser.add_argument('-m', '--mode', type=str, choices=['train', 'test'], default

2020-06-28 22:25:57 1197

原创 Python:函数参数类型及其用法

Python函数参数类型及其用法1. 必须参数2. 默认参数3. 不定长参数4. 关键字参数5. 组合参数函数的参数类型可分为:必须参数、默认参数、可变参数(不定长参数)、关键字参数、组合参数,总共5种。1. 必须参数def hello(str): print('必须参数是:',str)>>>hello('hello,world')2. 默认参数默认参数就是定义函数时,形参给定一个值。def hs(name,age=23): print('我叫:',name) pri

2020-06-27 13:00:53 892

原创 Python:命令行工具argparse模块的使用方法

python命令行工具的使用—argparse1. 写在前面2. 使用步骤1. 写在前面首先,如果你只是希望传一丢丢数据进去,那么只看下面两行就行了import sysprint("输入的参数为:%s" % sys.argv[1])>> python demo.py 1输入的参数为:12. 使用步骤(1) import argparse # 导入模块(2) parser = argparse.ArgumentParser() # 创建一个解析对象(3) parser.ad

2020-06-27 11:52:26 846

原创 Pytorch:学习率衰减及其用法

Pytorch的学习率衰减及其用法1. 为什么需要用到学习率衰减?2. Pytorch中学习率衰减的方法3. 使用库函数进行调整3.1 基本说明3.2 等间隔调整学习率 StepLR3.3 多间隔调整学习率 MultiStepLR3.4 指数衰减调整学习率 ExponentialLR3.5 余弦退火函数调整学习率 CosineAnnealingLR3.6 根据指标调整学习率 ReduceLROnPlateau3.7 自定义调整学习率 LambdaLR4. 手动调整学习率什么是param_groups?1.

2020-06-27 08:42:38 2167 1

原创 PyTorch中的model.modules(), model.children(), model.named_children(), model.parameters(), model.nam...

Pytorch中的model.modules,model.named_modules,model.children,model.named_children,model.parameter,model.named_parameters.model.state_dict实例方法的区别和联系1. model.modules()2. model.named_modules()3. model.children()4. model.named_children()5. model.parameters()6. m

2020-06-27 08:41:45 9985 6

原创 Pytorch:模型的保存与加载

Pytorch模型保存与加载,并在加载的模型基础上继续训练1.基本语句1.1 保存参数1.2 加载参数2. 语句分析2.1 torch.save()和torch.load()2.2 model.state_dict()2.3 model.load_state_dict()3. state_dict()和model.parameters()Pytorch保存模型保存的是模型参数1.基本语句1.1 保存参数一般地,采用一条语句即可保存参数:torch.save(model.state_dict(),

2020-06-27 00:31:31 1684 1

JDK中Sun包下源码zip文件

解决JDK源码缺失问题: https://blog.csdn.net/Pl_Sun/article/details/132060332

2023-08-02

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除