自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(542)
  • 资源 (13)
  • 收藏
  • 关注

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

责任链模式 模式对比 桥接模式:都有占位;但是桥接更注重唯一位置 策略模式:都有执行策略;但是策略模式一般都是单选,而且策略固定 状态模式:可能有多重策略流转;不过状态动态,且顺序执行 组合模式:都有递归遍历的形态;但是组合更多在于数据结构 装饰器模式:都有封装扩展;但是责任链上下文一致 和众多的设计模式相比,比起结构管理,责任链模式更多的在于功能管理。 泛化是设计模式的普遍特征,因此,复杂的功能经常都是由一个起点引发的关联执行。 这是一种深度的发展、分支的发散。 设计模式中也不乏横向的变化,但是都有一

2021-09-10 01:47:28 790

原创 设计模式-命令模式

命令模式 模式对比 如果选最相似的几个设计模式,那必定是 桥接模式:直接内核调用 观察者模式:直接通知 他们都毫无疑问的做到了一点:直接执行。 命令,不就是应该直接执行的么。 至于怎么处理,与我无关。 代码示例 interface Command { void execute(); } class Invoker { List<Command> commands = new LinkedList<>(); public void addCommand

2021-09-09 02:04:52 613

原创 设计模式-解释器模式

解释器模式 模式对比 顾名思义,解释器模式重在解释。 如何解释?和其他模式对比一下 策略模式:选择哪一个策略进行执行呢 状态模式:什么状态了,该用哪一个回调进行执行 可以看到,它的解释更多是需要告诉程序如何进行执行,至于其中包含的 条件 操作 数据 … 明显不是在较为狭窄的空间内的选择。 代码示例 public static void main(String[] args) { String stringExpression = "'hello ' + #name + ' !

2021-09-09 01:46:16 577

原创 设计模式-迭代器模式

迭代器模式 模式对比 设计模式之间差异真的很微妙,可以说它是基于更细粒度的准则聚合的规范。 设计模式的差异主要来源于针对的场景,目的不同则体现不同。 享元模式、原型模式和备忘录模式之间可见一斑,其他的就不一一列举。 而每种设计模式之间,还可以相互进行组合、嵌套,实在妙用无穷。 但是,需要对每种设计模式的针对功能有明确的认知。 对于迭代器模式,主要便是用于数据的迭代。 组合模式:同样是针对数据进行管理,但是体现方式差异巨大 观察者模式:组播情况使用可使用迭代器模式,不过针对性不同 可以说,迭代器模式并不复

2021-09-09 01:19:04 409

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

中介者模式 模式对比 最典型的莫过于房产中介了,熟悉两端,两端交互,两端收费。 从设计模式中找出相似的模式并不容易,而且差异不小 代理模式 装饰器模式 具体行为都不用详细对比,因为它明确的就只有单向调用。 其他设计模式也有回调这种形态,但是功能上没有更多的转发和管理。 更相似应该算是桥接,但是调用链其实还是单向的。 中介者自身的特质也能够直白的体现出来:传声筒。 但是传达过程中的其他操作和管理,这也是我们能够利用的空间。 代码示例 class Wechat { Map<String, Us

2021-09-08 01:28:16 345

原创 设计模式-备忘录模式

备忘录模式 模式对比 首先说明一下备忘录的本质:副本备忘,当主体销毁或者变动,能够进行之前状态的恢复。 这样一来,就能够随便抽取几个设计模式进行对比 缓存模式:缓存,本身可以当做副本的一种 原型模式:非引用的实现,也是副本 策略模式:因为状态的变化,副本并不一定唯一 可以看到,备忘录模式的核心在于副本和状态。 值的一提的是享元模式,因为享的定义是直接地引用而非复制,需要区分。 代码示例 class Note { Stack<String> copies = new Stack&l

2021-09-08 00:43:57 365

原创 设计模式-观察者模式

观察者模式 直觉背反 不能顾名思义,观察者模式是反直觉的,它的本质刚好和名字相反。 与其说是观察,核心其实在于通知。 这也不能说是故意为之,相比较与pull的监听,push实现起来不仅简单,而且节约资源。 虽说是监听xxx,本质上却是xxx主动通知。 模式对比 如果非要斤斤计较,能找到很多相似的设计模式,不过也只是部分相似 桥接模式: 整体模式还是基于占位+回调,但是观察者模式的占位并非一个,而是一堆。 至于回调,观察者模式中都是信息传递,具体的功能一般都不包含。 策略模式 虽然都有多种相同形式的回

2021-09-08 00:25:30 356

原创 设计模式-状态模式

状态模式 状态机 #mermaid-svg-SjBMBewgnKUitBTe .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-SjBMBewgnKUitBTe .label text{fill:#333}#mermaid-svg-SjBMBewgnKUitBTe .node rect,#mermaid-svg-S

2021-09-06 01:05:26 580

原创 设计模式-策略模式

策略模式 模式对比 从可替换的角度而言,由于设计模式都是基于接口抽象的,相似的实在太多。 不过唯一剔除的就必须是模板方法了,因为是外部控制策略,并非原有逻辑本身。 但是唯一的不同,就是策略二字。 不论是代理模式还是装饰器模式,亦或是其他,都只能说是为策略留有余地。 而策略模式,其实就是策略本身。 还有一点最大的特点,就是它的决策和动作是分离的。 就好比对象实体和指针引用一样,两方面都能很好的管理。 和其他模式对比,它严格的又两个部分。 注册表 把实体和名称分离以后,就是存粹的策略逻辑了。 Windows中

2021-09-05 01:11:20 395

原创 设计模式-模板方法

模板方法 模式对比 光从作用上进行对比,如下的涉及模式都可以完成类似的工作 桥接模式:实现占位,根据传入内核进行调用 装饰器模式:同代理模式,我们也可以实现装饰,不过必须返回占位对象的子类 代理模式:代理指定(空)方法 AOP:只是定位的方法不同,本身归于代理模式 继承绑定 即使有太多可以类比的设计模式,但是有两道坎是绕不过去的 功能:内部或者外部功能的区分,这里实在的把代理和装饰剔除了,因为它就是功能本身,而非外包装 继承:这就是完全区别于其他独立抽象的设计模式了,模板方法是强依赖继承的

2021-09-04 21:54:12 269

原创 设计模式-访问者模式

访问者模式 五马分尸 如果了解GO或者RUST,你会发现一些比较有意思的东西,尤其是在数据结构声明的时候。 在JAVA中偶尔会有一些思考,关于的就是对象方法和接口行为的理解,两者不同,却又似乎差异不大。 在GO和RUST中,数据结构的声明和方法是分离的,甚至方法都不一定要归属于同一个代码块。 很好理解这样的意图:能够为基础的数据结构快速增加额外的行为。 不过数据结构最好稳定一些,详细分析后面说到。 函数式编程 函数式编程中,函数是作为第一等公民。 JAVA支持函数式编程么,说实话,一直都能,但是一直都很

2021-09-04 21:12:52 354

原创 设计模式-代理模式

代理模式 模式对比 说到代理模式,不得不拿出来对比的还有如下几种设计模式 桥接模式:填充内核,直接调用内核,在意内核的可替换性,讲究广度 装饰器模式:直接调用内核,但是功能深层定制,讲究深度 如果说桥接模式主要是在于结构,装饰器模式核心在于功能,那代理模式核心就是管理了。 同样的内核调用,但是侧重点不同,使用方式也不同。 举个例子 @Transactional public void tx(){ // doSomething } 具体就不用多说了,后面的使用分

2021-09-04 20:02:11 288

原创 设计模式-享元模式

享元模式 相似对比 享元模式,顾名思义,是共享元数据,与此相同的还有其他模式,但是各有特点 原型模式:强调单一类型的复制操作,直接引用、内存拷贝、对象创建等多种方式。 缓存模式:直接将对象进行缓存,需要时直接进行获取,属于引用一类。 享元模式:部分数据缓存复用,而其他数据需要额外维护,有范围的区分。 举个例子 public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <=

2021-09-04 19:25:03 375

原创 设计模式-门面模式

门面模式 外部抽象 门面模式不算新的东西,还是抽象那一套 顶层抽象:大多设计模式都是面向抽象接口的 动作封装 动作组合:一般接口都是这样 功能组合:抽象工厂也是提供一堆的组合功能组合 功能明确 简洁明了:接口都是简洁且直接地,并且都是直观的 功能完备:每个接口都在自身的范围内闭环 值的一提的是它所谓的功能,并非所谓的小功能,而是针对一个复杂系统的完备API。 并非是小模块、小组件、小工具的小打小闹,而是真实的系统级别的接口。 在这个前提下,保证 简单 通用 完备 举个例子 public

2021-09-04 00:16:50 392

原创 设计模式-装饰器模式

装饰器模式 功能定位 有必要将装饰器模式和适配器模式与桥接模式对比一下,这三者真是失之毫厘谬以千里,可谓妙到毫巅。 桥接模式:快速内核替换;属于单类型横向扩展 适配器模式:多功能接口转换,对齐双端结构;属于单接口单点转换器 装饰器模式:单点功能装饰,深度定制;属于单类型的纵向扩展;并且天然具有串联属性 常见例子 public static void main(String[] args) { InputStream inputStream = System.in;

2021-09-03 22:34:25 373

原创 设计模式-组合模式

组合模式 数据管理 设计模式是结构管理,但是组件化和抽象的思想并不总是直接针对接口。 针对数据的模块化管理,也是设计模式的任务之一。 想象一下公司的组织架构图,想象一下服务架构图,这些都是数据管理,却划分成了不同的部门、模块。 而抽象成一种简单的表现形式,就是不断的层级嵌套,这就是组合模式的样式了。 树形结构 public interface Container { void addComponent(Container container); void draw(); } public

2021-09-03 21:35:49 372

原创 设计模式-桥接模式

桥接模式 替身之术 如果说前面的适配器模式是系统信息的对齐,那桥接模式可以说是信息传递的缓冲。 在前面的几种设计模式中,针对抽象我们的描述是一种占位,可以切换实现来完成不同的工作。 但是在很多场景中,我们的切换也需要一定的策略,缓冲能够很好地将这一层进行分离,单独管理. 不过,和硬性的策略制定不同,有些时候我们需要的是及时的替换,此时桥接模式就能够大显身手了。 桥接一下 interface ExecuteService { void execute(Runnable task); } inter

2021-09-03 02:08:10 399

原创 设计模式-适配器模式

适配器模式 石油交易 布雷顿森林会议使得美元和黄金挂钩,后续的石油交易也沿用了美元进行交易。 也就是说,你想买石油,需要使用美元进行结算。 如何使用人民币进行石油交易呢? 显然,首先使用人民币进行美元的兑换,然后使用美元进行石油的购买。 这也是适配器模式的作用,沟通两个不对等接口,使其保持沟通。 简单例子 interface Transfer { void transfer(); } interface BankTransfer { boolean auth(); void t

2021-09-03 01:45:43 318

原创 设计模式-原型模式

原型模式 作用 原型模式可以单纯的理解为统一源头:从一个标准的源派生出一个的对象。 核心在于快速的获取一个对象的实例,更多功用在于实现逻辑上的区别。 场景 多处修改 针对单一对象,在多处代码中进行属性修改。可以是使用原型模式进行快速的获取副本,独立的进行修改。 副本创建 对于一个频繁创建单一对象的场景,可以直接使用原型拷贝,然后进行差异点修改,避免从新创建对象开销。 快速复制 对于对象的拷贝,基于内存拷贝比从头创建一个对象、设置属性更加快速。 优势 它的功用的确十分简单,纯粹的就是对象复制,关键

2021-09-03 00:25:08 273

原创 设计模式-工厂模式

工厂模式 抽象 不论是抽象类,还是接口,它最大的作用就是占位,根据替换不同的具体实现,达到后期扩展的目的。 此时,凸显出了两个问题 选择策略的管理 对象创建的管理 针对对象创建这个问题,如果零散的进行创建,后期的维护势必显得困难。 好在如今的IOC框架的多样,使得我们关注关联关系即可,对象的创建都收归在了一处。 还有一个问题在于,抽象的占位,并非只能够接入一个具体的实现,它只是一次只能一种罢了。 针对具体实现的切换、选择,这部分的选择策略如何进行管理呢。 public class CarFactory

2021-09-02 01:31:26 250

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

建造者模式 一个例子 class Person { private String name; private String gender; private Integer age; public static Person builder(){ return new Person(); } public Person name(String name){ this.name = name; return th

2021-08-31 09:11:58 446

原创 设计模式-单例模式

单例模式 基础单例 饿汉模式 public class Single { private static final Single INSTANCE = new Single(); public static Single getInstance(){ return INSTANCE; } } 懒汉模式 public class Single { private static final Single INSTANCE = null; pu

2021-08-31 01:00:00 163

原创 java-hash

对象比较 两个对象,是否相等 上述命题是否正确呢?其实问题本身就存在问题 两个对象指向的是同一个实体 两个对象确定是不同实体,但是实体之间存在比较关系 对于不等判断太简单,而对于相等这个话题,需要深究。 硬相等 如果两个对象确定是同一个,这个时候可以称得上是相等的:自身必然是自身。 这种所谓的相等其实是指定对象的身份验证,属于一种物理上的相等。 软相等 这是一种普遍的、常态的比较方式,正如同一个牌子,同一个型号这种说法。 在大多时候,即使是不同的事物,我们也需要它相等,这时候需要的是逻辑上的相等。

2021-04-22 17:50:03 241

原创 算法-递归

#核心分析 递归很简单: 递:向下传递 归:向上收束 可以看做是到达边界后反弹,因此,递归边界是不可或缺的。 组合思想 递归的结构并不复杂,但是可谓威力强大的。 不仅是因为神奇的结构性质,和许多巧妙的思想是分不开的。 闭包拆包 闭包是编程中的一大利器,思想层面上的影响也更加深远。 正如日常的电子产品、自定向下的设计方式、程序代码中的接口设计等,我们都无需关心内部的实现,我们依然得心应手。 思维上面,我倾向于将它看做:不同领域的环境变量控制。 在递归过程中,每一层的结构可以这样划分 当前层的结果计算

2021-04-22 16:41:18 299

原创 leetcode-91

题目 一条包含字母 A-Z 的消息通过以下映射进行了 编码 : 'A' -> 1 'B' -> 2 ... 'Z' -> 26 要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,“11106” 可以映射为: “AAJF” ,将消息分组为 (1 1 10 6) “KJF” ,将消息分组为 (11 10 6) 注意,消息不能分组为 (1 11 06) ,因为 “06” 不能映射为 “F” ,这是由于 “6” 和 “06” 在映射中并不等价。 给

2021-04-21 16:19:58 336

原创 java-synchronized层次

缺点什么 思考还是吃饭,这是一个问题。 一个坑位一个人,的确不能你拉我身上,我拉你兜里。 对于存在多个独立的操作者对公共资源的操作的问题,为了维持秩序,也为了公共财产的安全,应该需要那么一种东西来保证 对于公共资源,每次只能够有唯一一个操作者操作 这时候,就应该有一个凭证,它让拥有的操作,未拥有的等待; 贴切一点,就把它称为了锁,有了锁就拥有了操作权,想要操作,就需要先获取锁。 阴阳颠倒 对于多锁导致的死锁问题这里不赘述,主要讨论锁和资源的主次地位的变化。 锁怎么来的,大概是这样了;更混乱的问题

2021-04-21 01:20:50 236

原创 leetcode-33

leetcode33 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。 给你 旋转后 的数组 nu

2021-04-19 14:47:58 879

原创 d3-数据操作

enter-update-exit 将数据和图形分为两个领域,分别记作A和B,相互之间绑定才能做出图形展示,可以产生下面四种情况 领域 状态 表示 数据 未绑定图形 A−(A⋂B)A - (A \bigcap B)A−(A⋂B)A0A_0A0​ 数据 已绑定图形 A⋂BA\bigcap BA⋂BA1A_1A1​ 图形 未绑定数据 B−A⋂BB - A\bigcap BB−A⋂BB0B_0B0​ 图形 已绑定数据 A⋂BA\bigcap BA⋂BB1B_1B1​ 可以看到,整个

2021-04-02 16:42:30 456

原创 d3-元素筛选

元素筛选 基础筛选 format description foo foo标签 #foo id为foo .foo class包含foo [foo=goo] 存在属性foo=goo foo goo foo下的goo标签 foo#goo foo下的id为goo foo.goo foo下的class包含goo foo:first-child foo标签的第一个子元素 foo:nth-child(n) foo标签下的第n个元素 单元素选择 <p id="tar

2021-04-01 15:47:46 682

原创 elisp-参数类型

基础参数 (defun distance (from to) (- to from)) 可变参数 (func lots-of-params(&rest params) (message (format "%s" params))) &rest:多个参数 归约调用 (defun reduce(func &rest numbers) (apply func numbers)) ;; sum (reduce '+ 1 2 3 4 5) ;; sub (r

2021-03-18 19:42:36 492

原创 es-dsl

DSL 原子查询 查询全部 GET /{index} { "query":{ "match_all":{} } } match # 简写 GET /{index}/_search { "query":{ "match":{ "{field}":"ABCD" } } } # 全 GET /{index}/_search { "query":{ "match":{

2021-03-08 23:21:34 351

原创 java-apollo控制日志级别

@Configuration public class LoggerLevelUpdater { private static final String PREFIX = "logger.level."; private static final String DEFAULT_LEVEL = "WARN"; private static final String NAMESPACE = "application"; @Autowired Loggi

2021-03-08 13:56:33 353

原创 simple-bytebuddy

操作对象 // 这个对象作为操作工具起点 ByteBuddy byteBuddy = new ByteBuddy(); 环境设置 byteBuddy.with(new NamingStrategy() { private final String genericPrefix = "com.godme.bytebuddy."; public String subclass(TypeDescription.Generic generic) {

2021-03-04 17:22:18 298 1

原创 emacs-interactive

函数模板 ;; 函数定义 (defun new-func(func-name) "create func template" ;; 模板插入 (insert (concat "(defun " func-name "()\n ())")) ;; 光标回退到括号 (backward-char 2)) 交互函数 (defun new-interactive() "create interactive func template" (insert (co

2021-03-03 15:31:46 267 1

原创 java-字节码例子

IDEA工具 工具配置 快捷键设置 主要是我菜单实在找不到externel tool,只能直接用快捷键了。 简单例子 指令格式 index command [<operand1> <operand2> ...] field description index 编号,简单当作地址 command 操作命令 operand 操作数 简单例子1 public static void main(String[] args) { int

2021-03-01 19:59:54 607

原创 java-简单字节码指令

类型指令 opcode byte short int long float double char reference Tipush bipush sipush Tconst iconst lconst fconst dconst aconst Tload iload lload fload dload aload Tstore istore lstore fstore dstore astore Tinc iinc Taloa

2021-03-01 15:34:32 270

原创 emacs-字体大小

key function description C-x C-+ text-scale-increase 字体增大 C-x C-- text-scale-decrease 字体减小 C-x C-0 text-scale-adjust 默认大小

2021-02-24 19:00:31 548

原创 emacs-lisp交互模式

M-x ielm

2021-02-24 11:28:13 447

原创 emacs-全屏

(add-to-list 'default-frame-list '(fullscreen . maximized))

2021-02-23 19:37:53 468

原创 emacs-org-时间

创建 key description C-c . 创建时间戳默认有日期没时间,需要手动指定 C-c ! 同C-c .,不激活 C-c d C-c C-d deadline S-left(right) 光标日期±1\pm1±1天 S-up(down) 滑动修改光标指定的参数 C-c C-s scheduled 工作记录 key description C-c C-x C-i 记录开始时间 C-c C-x C-o 停止计时 C-c C-x C

2021-02-20 14:53:59 410

logstash安装办法

logstash安装要求不步骤,以及简单的使用办法和过滤规则讲解

2018-03-01

elasticsearch安装文档

elasticsearch环境搭建,错误解决办法,配置和基本查询语句

2018-03-01

kibana安装及使用文档

kibana环境安装,elasticsearch对接,数据绘图,报警插件的安装,查询语句以及定时任务脚本设置

2018-03-01

SGIP服务端

联通网关模拟服务,用来测试验证编写的客户端程序。。

2018-03-01

SGIP协议文档

联通封装的GSM文档,针对短信业务的网关之间以及SP之间的通信协议

2018-03-01

netty-api-chm

netty-api-chm文档,梳理netty结构,便于源码学习和使用

2018-09-13

source练习资源

包含基本数据data.csv 结果逻辑result.dot 还有dot可视化工具graphiviz(安装,配置环境变量,按照命令执行即可)

2018-04-22

5.6drools基础包

包含drools安装包和runTime,由于上传大小限制,其他额外包没有同意打包 但是学习足够了

2018-08-23

jd-gui反编译工具

反编译工具,通过class反编译查看java源代码,通过反编译确认逻辑,排查问题和读取现有class逻辑

2018-09-14

latex文档

latex 排版学习笔记

2020-04-16

knn学习数据

csv格式irs数据 自己编程学习使用 其他排布格式需自己转换

2018-04-22

空空如也

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

TA关注的人

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