自定义博客皮肤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)
  • 收藏
  • 关注

原创 (十五)访问者模式

我理解,访问者模式就是用接口嫁接实体类,使得实体类有了一个窗口,可以被接口的实现类访问,进而对实体类做一些操作public class Priority { private Long id; private String name; // get and set public <T> T execute(PriorityOperation<T> operate) ...

2020-02-22 23:23:32 169

原创 (十四)责任链模式

基于面向对象的思想,想想业务中哪些流程是可以组装为一个链条的就是说会有一些相似的业务,组成的功能链条可能只是顺序会改变,或会增减链条节点,就可以用责任链模式复用代码每一个Handler都持有下一个Handler的引用,他如果判断还有下一个Handler,就会继续往下执行public abstract class Handler { protected Handler successor;...

2020-02-19 23:54:16 161

原创 (十三)装饰器模式

对已有类进行增强public interface Component { void execute();}public class ConcreteComponent implements Component { @Overide public void execute() { System.out.println("基础功能"); }}public class Deco...

2020-02-19 23:33:01 127

原创 (十二)享元模式

public interface FlyWeight { String getName(); void setName(String name); void execute();}public class ConcreteFlyweight implements Flyweight { private String name; public ConcreteFlyweight(St...

2020-02-16 23:47:39 114

原创 (十一)状态模式

在业务中,常常有那种状态巨多的东西,比如一个立项,可能有新建、已提交、已审批等多种状态一个活动可能有新建、已提交、审核通过、执行中、结束等多种状态因此,这个设计模式,指的是面向一个立项、一个订单这个"对象"的逻辑public interface State { void execute();}public class NewState implements State { publ...

2020-02-16 23:32:12 117

原创 (十)命令模式

public interface Command { void execute();}public static class CommandA implements Command { public void execute() { System.out.println("命令A的逻辑"); }}public static class CommandB implements ...

2020-02-16 23:05:12 78

原创 (九)策略模式

应该作为ifelse多个条件判断的最佳替代这里不是说ifelse不够清晰,相反,策略模式正是利用了ifelse的清晰因为业务代码中并不是简单的ifelse,而是一个ifelse之间可能间隔了几十行垃圾业务代码,而且判断的条件很模糊,看不懂简单的ifelse当然清晰,策略模式正是将业务代码变成简单的ifelse所以,我们要将代码改造成以下这样:public interface Calcul...

2020-02-16 22:57:21 115

原创 (八)构造器模式

想象一下复杂对象的构建逻辑Product product = new Product();System.out.println("为了得到值1,进行复杂的校验");product.setField1("值1");System.out.println("为了得到值2,进行复杂的循环,和数据转换");product.setField2("值2");System.out.println("为...

2020-02-16 19:25:00 133

原创 (七)外观模式

外观模式主要用于多个系统间调用假如A系统有123三个模块此时B系统要调用A系统的123,实现自己的业务逻辑问题在于,系统之间是透明的,各自的开发不知道对方的逻辑,导致A从此以后不敢乱改123模块。。。此时就可以用门面模式,将多个模块封装到一个门面中,暴露出去,这样以后只维护这一个门面就行了service就是一个经典的门面模式,别的系统不用直接一戳到底,调用我们的DAO,而是面向我们的se...

2020-02-16 18:48:05 83

原创 (六)工厂方法模式

工厂方法模式其实是 模板方法+简单工厂 模式场景:简单工厂就是把我们想生产product的条件丢进去,工厂自己判断,造一个实现类返回给我们现在我们有多个工厂生产多重产品,但每个工厂造每个产品时,都有一些相同的逻辑,和一些不同的逻辑,那此时就可以结合模板方法模式了我们先把简单工厂放进来public interface Product() { void execute();}publi...

2020-02-16 18:18:58 131

原创 (五)模板方法模式

将公用的方法放在父类组合,确定顺序,然后实现交给子类结合策略模式使用场景:有不同的优惠券策略,然后每种策略在实现的时候,走的是统一的一套逻辑流程,但又有某些策略的流程不太一样,有一点小特殊流程此时,每种策略的实现就可以用模板方法模式,抽象出公共的顺序如果不用模板方法,代码将是这样的public class StrategyA{ public void calculate() { S...

2020-02-16 17:24:55 118

原创 (四)适配器模式

简而言之,就是在新接口中注入老接口的实现类,这样就能既使用新接口,又能复用老接口实现类的方法具体塞入老实现类的逻辑,就是在适配器的构造方法中new之public class NewInterfaceAdapter implements NewInterface { private OldInterface oldObject; public NewInterfaceAdapter (Old...

2020-02-16 01:14:22 98

原创 (三)迭代器模式

假设有个学生类Student,教室类Classroom,教室类中有学生类的数组型的私有变量public class Student{}public class Classroom{ private Student[] students;}如果我们将他们new出来,然后组合在一起,如果我们只有教室类,这时想要遍历学生那么只要new教室类,然后get学生数组,然后for循环遍历学生即可...

2020-02-16 00:47:17 133

原创 谈谈超越技术的思维

编程的本质,可以追溯到上个世纪图灵创造了图灵机,所谓图灵机,就是计算机的本质,就是有一定内存的,可以计算、判断逻辑的机器总而言之,只要满足图灵完备,就可以解决任何运算问题,而现代的编程语言都满足图灵机的定义各个编程语言的区别仅仅是判断逻辑的过程不同,效率不同而已如果以Java的视角来看,Java语法本身的if/else,while等等就是在试图表述Java是个图灵完备的语言技术永远是为了...

2019-09-13 21:49:10 261

原创 JavaScript为什么强大,BS/CS,前后端分离演变史

JavaScript王者归来JavaScript最初只是一个脚本语言,为了给浏览器渲染的页面一点绚丽的效果,这时MVC正在大行其道,前端完全依赖后端第一次变革是在2005年Google推广Ajax,使得人们第一次意识到了JS的强大,能够使网页异步无刷新显示数据这时前端由于有了交互的本领,已经可以叫做App了,所以叫做Single Page Application,SPA单页面应用时代于是前...

2019-09-13 17:52:42 4417

原创 (二)简单工厂模式

站在更高的层面考虑,简单工厂其实也是一种中间件思想假设有这样一种常见的场景,有一个基类叫common,是一个抽象类,封装了需要子类实现的功能,以及公用的功能子类A和B就是业务方要我们实现的功能,他们继承了公用的功能,同时又实现了自己特有的功能好,现在我们业务代码写好了,前端代码可以调用我们的业务功能A和B在自己内部判断,如果用户需要A功能,就调用A,如果用户需要B功能,就调用B,此时他是依...

2019-09-08 22:51:33 87

原创 (一)单例模式

单例已经被被讲烂了为什么用?主要是为了避免频繁创建某个常用对象,节省资源一共有八种写法,主要是创建对象的地点和时机各不相同,但总的来说只要注意写出四点一是将类私有化,二是该类自己创建一次,三是有一个外部获取的方法,四是线程安全1.饿汉式,静态常量private单例类的构造函数,使得外部不能创建该对象用一个静态的常量表示单例对象,表示该对象只有一份自己new一次赋值给该常量,然后写一个...

2019-09-08 22:19:07 84

原创 设计模式——总纲

一句话概括,设计模式是对软件设计中普遍存在的(重复出现的)各种问题,提出的解决方案简单说就是一种写代码的最佳实践用了设计模式有什么好处?使得程序高内聚低耦合程序可靠性高,就是说增减功能系统不会随便挂掉程序扩展方便,就是说增加功能改代码很方便程序重用性好,就是说不用重复写代码,都提出公共代码了程序可读性好,就是接手的人不会云里雾里看不懂设计模式分类创建型,就是说对象应该怎么创建,比...

2019-09-08 19:43:13 104

原创 加密算法详解

密码怎么存——哈希算法密码怎么存?当然是加密存储,加密算法其实就是哈希算法哈希算法就是一种散列,或者说映射最简单的哈希算法:%取余常见的哈希算法:MD5,SHA256,SHA1等特点一:输入的内容唯一对应输出的内容用这种散列的特性来存放文件,就是说对每个文件进行哈希取余都能得到一个小于服务器个数的值,对应的将数据保存到这个编号的服务器上去下次用户来取的时候,还是用这个哈希算法,还是会...

2019-09-07 22:57:05 161

原创 HTTPS加密原理

问题消息安全问题就是说消息不能被伪造,不能被监听消息可以是任何数据,可以是发送的数据,可以是发送的密码等被伪造就是黑客篡改了我们的消息,被监听就是说黑客知道了我们的消息内容对称加密对称加密本身是一种完美的解决方案,前提是不能让人知道PSK,所谓PSK就是pre shared key,一种加密算法,或者说加密规则,我们的数据+PSK就组成了一段密文难点就在如何让服务器和客户端都知道PSK...

2019-09-07 20:56:11 111

原创 新东家入职有感

9月纪念入职新东家,感觉像是刘姥姥进了大观园,土八路遇上正规军,与之前小作坊式的开发模式有了翻天覆地的变化。开发模式的转变遵循一定的敏捷开发模式,TL会在统一的效能平台上创建新的story(有固定的需求名称,一般是[需求名称]+需求号+要实现的功能),然后添加相应的人员,可以将一个大story分解成小story给多个小team开发,此时story的状态是待开发。开发人员看到新的任务后,在gi...

2019-09-07 15:43:05 286

原创 记一种通用的基础架构方案

package规划基础架构包:xxx-framework-parentxxx-framework-utilxxx-framework-common——通用异常处理——通用响应实体、响应Code枚举定义xxx-framework-modal——实体类分模块定义——各模块通用请求(组合实体类)和响应实体、响应Code枚举定义业务逻辑包:xxx-service-api——接口统一...

2019-08-18 17:18:45 206

原创 支付项目中常见的难点

支付平台与银联存在互相回调延迟,造成双方数据库支付记录不一致总的来说,这是一个本地服务与第三方服务之间的分布式事务问题。因为根本就不是一个公司的,所以是没办法保证强一致性的。只能遵循BASE理论,也就是保证两个系统的最终一致性,允许中间有部分时间是由于延迟或者系统挂掉造成的不一致。总的解决方案就是重试+补偿。先说一下和第三方系统对接调用的流程:假设本地服务是支付平台,第三方系统是银联,...

2019-08-16 00:13:30 4368

原创 CentOS7虚拟机搭建及各种环境配置笔记

安装下载minimal版本即可,不需要界面配置桥接静态网络nat是使用主机ip,不能作为测试机,只能上网玩玩;仅主机模拟局域网,不能连外网;桥接模式通过互联网将主机和虚拟机组成不同的机器,可以互联,也可以上网。刚装好的linux是不能上网的,ip addr只能看到一段127.0.0.1的网络。vi /etc/sysconfig/network-scripts/到此文件夹下看一下,ifc...

2019-08-11 16:31:26 191

原创 SpringCloud之Sleuth调用链路追踪

先建立ZipkinServerpom <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1....

2019-07-18 20:35:37 594

原创 SpringCloud之Config统一配置中心

新建config服务pom <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.R...

2019-07-18 20:00:21 167

原创 SpringCloud之Zuul网关路由

创建zuul-server服务pom<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version&g...

2019-07-18 19:22:09 91

原创 SpringCloud之Feign+Hytrix+Dashboard服务调用+熔断降级+监控

pom <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency&...

2019-07-18 18:08:55 306

原创 SpringCloud之Ribbon+Rest调用负载均衡

另外创建一个服务用来远程调用多个服务,对调用的服务进行负载均衡(1)pom.xml<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5....

2019-07-18 16:28:57 99

原创 SpringCloud之Eureka注册中心

eureka server(1)pom.xml<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</vers...

2019-07-18 16:09:39 116

原创 AOP递归拦截器链剖析

首先我们得明白动态代理,其实就是创建了一个proxy对象,实现了目标方法的接口或者修改字节码什么的,使得这个对象调用起来和目标对象一样一样的。然后在这个proxy中有和目标对象一样的同名方法,我们在这个方法前后加上增强,也就是前置通知和后置通知,就实现了代理。AOP会将这些增强代码包装成拦截器,组合成拦截器链,通过递归的方式巧妙实现Before -> 目标方法 -> After形式...

2019-06-27 18:09:59 532

原创 接口联调经验

后端如何定义接口接口整体定义:定义接口名称、请求方式、请求路径,以及接口的描述接口详细定义:后端返回码、后端返回的一个样例(返回字段结构:对应字段名和内容)、后端的其他返回码(异常码)前端传递的参数及描述、前端传递参数的一个样例前后端联调可能出现的问题1、get,post 方法使用错误2、地址使用错误,地址错误都是找不到资源,后端返回4043、传给后端的参数缺少某个必填选项,参...

2019-06-26 12:38:26 11946

原创 接口幂等性和并发安全性设计

什么是接口幂等就是一个接口,被重复调用多次,却能够保证对系统内部产生的影响是一致的,也就是调用多次和调用一次,数据的变化是一样的,是相同的,不会因为调用多次而出现任何数据问题,大体上又分为服务层接口幂等和数据层接口幂等。数据层接口幂等设计所有的数据层接口都可以分为insert、delete、update、select四种。1.select天然幂等,多次查询和一次查询都是一样的。2.del...

2019-06-25 12:14:06 1748

原创 深入理解通配符

泛型通配符:List<? extends Number> list = new ArrayList();List<? super Number> list = new ArrayList();java编译时类型和运行时类型定义两个类,Apple继承FruitClass Fruit {}Class Apple extends Fruit {}// app...

2019-05-01 21:10:48 199

原创 新机器java及idea环境配置

环境变量之win篇1.安装JDK。2.在系统变量新建JAVA_HOME,变量值是JDK解压目录,如C:\jdk3.修改Path,在最前面加上%JAVA_HOME%\bin;在cmd中运行java -version环境变量之mac篇1.安装JDK的dmg。默认安装目录是/Library/Java/JavaVirtualMachines/jdk1.8.0_161.jdk/Content...

2019-02-14 16:12:24 244

原创 详解TCP/IP

1.TCP/IP简介协议是指计算机之间通信的规范,TCP/IP协议共分为四层。1.链路层:用来处理连接网络的硬件部分,如设备驱动,网卡。2.网络层:用来处理在网络上流动的数据包,数据包是网络传输的最小单位,该层的作用就是选择传输路线把数据包传输给对方。3.传输层:承载TCP/UDP协议。4.应用层:承载FTP/DNS/HTTP协议。2.访问网页过程1.浏览http://index.c...

2018-12-04 10:36:13 552

原创 CentOS6.5安装Redis

1.解压编译并配置tar -xvf redis-4.0.9.tar.gzmv redis-4.0.9/ rediscd redismake &amp;&amp; make installvim redis.conf修改以下配置:#bind 127.0.0.1 # 将这行代码注释,监听所有的ip地址,外网可以访问protected-mode no # 把yes改成no,允许外网访问...

2018-12-02 12:19:21 429

原创 CentOS6.5安装RabbitMQ

1.上传三个安装包esl-erlang_17.3-1~centos~6_amd64.rpmesl-erlang-compat-R14B-1.el6.noarch.rpmrabbitmq-server-3.4.1-1.noarch.rpm依次安装,前两个需要联网,最后一个本地安装yum -y install esl-erlang_17.3-1~centos~6_amd64.rpmyum...

2018-12-01 17:17:27 302

原创 CentOS6.5配置ElasticSearch

1.更改权限elasticsearch出于安全考虑,不允许root对其进行操作,所以我们创建一个新用户,递归更改文件夹的权限chown {username}:{username} elasticsearch-6.2.4/ -R2.配置1.更改config文件夹下的jvm配置文件,把堆内存调小,根据自己虚拟机内存设置的大小。2.1 更改elasticsearch.yml中的两个path到...

2018-11-28 00:36:43 116

原创 debug跳到DynamicAdvisedInterceptor和InvocationtargetException

在debug spring代码时,invoke service没有报错,却自动跳转到DynamicAdvisedInterceptor和InvocationtargetException,网上的说法是被调用的方法没有捕获异常。可我自己明明在被调用的方法内部写了异常捕获,后来发现,debug时要在被调用的方法内部也打上断点,只在外部打会造成debug到这一步时卡在这一步而未捕获异常的bug。至于...

2018-11-27 09:03:24 1094 1

空空如也

空空如也

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

TA关注的人

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