
Java
文章平均质量分 78
奥利弗的巨大泰迪
这个作者很懒,什么都没留下…
展开
-
Netty(一):基础概念及消息处理流程
1. Netty是什么? Netty是由JBOSS提供的一个java开源网络通讯框架。Netty可以提供异步的,非阻塞的,事件驱动的网络应用程序框架和工具,非常适合用来快速开发高性能、高可靠性的网络服务器和客户端程序。Netty是一个基于NIO的客户、服务器端编程框架,使用Netty 可以让我们快速和简单地进行网络通讯和数据传输。2. 接收请求和处理流程原创 2017-08-15 21:12:15 · 6997 阅读 · 0 评论 -
设计模式——享元模式
一、什么是享元模式? 享元模式的主要目的是实现对象的共享,当系统中有多个相同的对象,那么不需要实例化多个对象,只需要共享一个对象即可,这和对象池的概念类似,通常与工厂模式一起使用。比如有一家店做外卖,如果每以个订的食物都作为一个对象,那么几千单就有几千个食物对象,这是一种耗费内存的操作。事实上,一家店的菜单上食物一共也就几十种,这几千个订单完全可以共享相同的食物对象,这就是享元模式的一个应原创 2017-12-14 10:16:16 · 287 阅读 · 0 评论 -
设计模式——责任链模式
一、什么是责任链模式?责任链模式中,存在多个对象,每个对象持有对下一个对象的引用而形成一条链,请求在这条链上传递,直到其中某一对象决定处理该请求。然而请求发出者并不清楚最终哪一个对象会处理该请求,所以,责任链模式可以在不影响客户端的情况下,对系统进行动态的调整和重新组织。责任链虽然叫做链,但是事实上它的结构可能是一个单向的链表,也可能是一个单向环形链表,也有可能是一个树状结原创 2017-12-06 10:21:19 · 243 阅读 · 0 评论 -
设计模式——备忘录模式
一、什么是备忘录模式? 备忘录(Memento)模式又叫做标记(Token)模式。备忘录中存放着对象的历史状态,当对象状态改变后,想要恢复先前的状态时,就可以使用备忘录来恢复。 备忘录模式中存在以下角色: 1. 发起者(Originator)角色:创建一个备忘录,内部记录其此时的状态,需要时可以使用备忘录来恢复状态 2. 备忘录(Memento原创 2017-12-23 11:46:44 · 437 阅读 · 0 评论 -
设计模式——建造者模式
一、什么是建造者模式? 当一个对象的创建包含该对象的部件部分及部件的装配过程时,建造者模式可以将对象的部件生成过程及装配过程进行分离解耦,从而使系统结构变得更加清晰。举个栗子:我们知道电脑是由CPU,硬盘和内存组成的,那么如果我们要创建一个电脑,首先的思路就是我们去制造CPU、硬盘和内存,然后进行组装,这样就生成了一台电脑。仔细一想,这个模式存在很多问题,它将部件的生成和组装放在了一起,那原创 2017-12-15 11:25:58 · 384 阅读 · 0 评论 -
设计模式——模板方法模式
一、什么是模板方法模式? 我们经常会遇到一个问题:我们明确了某个方法的执行步骤及其顺序,但是某几个步骤的具体实现我们暂时未知,需要按照具体的情况具体处理。模板方法就是定义了某个方法的执行步骤及顺序,而将某些与具体实现的步骤延迟到子类中去执行。模板方法模式把那些不知道具体实现的步骤封装成抽象的方法,子类通过继承去实现各个抽象。 举个形象的例子,如果我们要画画,那么首先我们规定了画画原创 2017-12-24 11:22:30 · 477 阅读 · 0 评论 -
设计模式——状态模式
一、什么是状态模式? 状态模式允许一个对象在其内部状态改变时改变它的行为,可以让对象根据不同的外部情况做出不同的响应。比如在访问论坛网站的时候,我们希望根据用户的性质来区分他们的一些权限,比如游客不能回帖,普通用户不能删帖,而管理员可以有很多特殊权限如置顶,加精等。 简单的来说,状态模式有以下两个角色: 1. 状态(State)角色:封装着不同语境(Con原创 2017-12-25 10:50:22 · 322 阅读 · 0 评论 -
设计模式——策略模式
一、什么是策略模式? 策略模式就是定义一系列的算法,并将它们封装,使他们可以相互替换。策略模式使得算法以独立于客户而变化。 策略模式涉及到以下几个角色: 1. 抽象策略角色:定义了具体策略需要实现的抽象方法或接口 2. 具体策略角色:封装具体的算法 3. 环境角色:内部持有策略类对象的引用 举一个简单易懂的例子——计算器,计算原创 2017-12-26 11:03:04 · 274 阅读 · 0 评论 -
设计模式——命令模式
一、什么是命令模式? 命令模式将一个请求封装成一个对象,从而可以对不同的请求作出不同的回应。比如在公司,老板发出一条命令给小组leader,leader又派发给手下的组员。这个过程使老板、命令、leader和执行命令的组员几者解耦,任何一方都不用去依赖其他人,只需要做好自己分内的事情,老板只需要结果,他并不需要知道到底哪个员工完成了命令,员工也不需要知道这个命令是谁发布的,只需要按照原创 2017-12-27 11:10:49 · 250 阅读 · 0 评论 -
设计模式——工厂模式
一、什么是工厂模式? 工厂模式就是创建一个对象的工厂接口,创建对象不再是通过new这个对象来直接实现,而是通过工厂来对对象进行创建。应用工厂模式可以降低系统间的耦合度。工厂模式中一般有以下角色:1. 抽象产品类:是具体产品对象的基类2. 具体产品类:实现了抽象产品类接口,每一个具体产品类都会对应一个工厂3. 抽象工厂:工厂模式的基类,定义了工原创 2017-12-19 11:05:58 · 594 阅读 · 2 评论 -
设计模式——解释器模式
一、什么是解释器模式? 解释器模式定义语言的语法,并建立解释器来解释语法中的句子。如正则表达式等的解释器。 解释器模式涉及到以下几个角色: 1. 抽象表达式角色:定义了具体的表达式需要实现的抽象解释方法或接口 2. 具体表达式角色:指定了具体的表达式的解释 3. 环境(Context)角色: 包含了解释器之外的一些全局信息 4. 客原创 2017-12-28 11:21:03 · 270 阅读 · 0 评论 -
设计模式——迭代器模式
一、什么是迭代器模式? 我们在Java中经常会遇到集合对象,这些集合对象内部有着各种各样的实现。如果我们去遍历集合中的数据,那么就需要各种各样的实现。迭代器模式就可以解决这种场景,它分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样就可以既不暴露集合内部的结构,又可以让外部程序访问集合内的数据。就像Collection集合类中有List和Set,要去访问他们内部的数据,我们只需要原创 2017-12-29 11:14:47 · 226 阅读 · 0 评论 -
设计模式——访问者模式
一、什么是访问者模式? 在每个自定义对象中定义一个accept(请求访问)方法,这个方法以对象为参数,调用访问者的对象的visit方法来操作此对象。访问者模式对于开闭原则没有很好的支持,它允许修改节点中的方法,因此访问者模式应该应用在访问类结构比较稳定的时候。 访问者模式涉及到以下几个角色: 1. 抽象访问者:定义访问接口 2. 具体访问者:实现原创 2017-12-30 11:54:18 · 282 阅读 · 0 评论 -
Java中@Param注解
@Param:用来在DAO层中声明参数,如:List<News> selectByUserIdAndOffset(@Param("userId") int userId, @Param("offset") int offset, @Param("limit") int limit);当使用了使用@Param注解来声明参数时,如果使用 #{} 或 ${} 的方式都可以。 @Selec...原创 2018-04-18 16:26:51 · 26873 阅读 · 0 评论 -
Java用POI读取excel文件,报异常:NotOLE2FileException: Invalid header signature; read xxx, expected 0xE11AB1A1
这几天在开发时遇到了极其坑爹的问题。开发的主要功能是在导出某些订单数据至Excel,因为自己一个一个去写表头这种操作代码耦合性实在太强,到时想要修改表头格式又需要回到去代码中修改,所以这是一种很愚蠢的零分操作!那么在这里就用到了POI的Excel模版功能(POI是apache提供给java对office进行读写操作的库,也是前些天开发时才了解到)。模版作为一种资源文件就被我存放在聚合工程的某一mo...原创 2018-06-18 20:59:45 · 30059 阅读 · 12 评论 -
设计模式——原型模式
一、什么是原型模式? 原型模式是一种创建型的设计模式,是通过已存在的对象实例克隆出一个对象,而不是通过调用构造方法创建的,克隆对象与源对象具有相同的属性。 Java中通过clone()方法来实现对对象的克隆,所以原型模式应用很简单。 根据表现形式原型模式可以分为两种:(1)简单形式 (2)登记形式 二、原型模式框图原创 2017-12-22 11:30:39 · 334 阅读 · 0 评论 -
设计模式——中介模式
一、什么是中介模式?中介即Mediator,用中介对象来讲交互的几个对象进行封装,对象间不再直接进行通讯,而是通过中介间接沟通,降低了对象之间的耦合程度。当对象之间进行复杂的交互,对象之间的依赖混乱,这个时候就可以使用中介模式。二、中介模式框图使用中介模式的一个典型的场景是相亲。以前的相亲涉及到了男女两方及互相的父母,如果男方想向女方提出约会的请求,这个时候男方原创 2017-12-13 10:00:23 · 284 阅读 · 0 评论 -
Netty(二):服务端客户端实例分析
package com.netty;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelOption;import io.netty原创 2017-08-16 15:01:39 · 1753 阅读 · 0 评论 -
Netty(四):实现通道的多路复用
问题描述: 在进行压测时,一开始很正常,大约在30000次请求之后,错误率达到100%且接口耗时超过3s(人工设定的超时等待时间),查看日志后发现大量的Cannot assign requested address异常。 “Cannot assign requestedaddress”异常是由于Linux分配的客户端连接端口用尽,无法建立socket连接所致,虽然s原创 2017-09-10 19:40:54 · 8354 阅读 · 0 评论 -
Netty(三):网络传输中的拆包、粘包问题
问题来源: 在Netty中对于TCP传输的默认数据大小为1024字节,当数据包不超过1024时,会一次接收完毕,当超过1024时,首先会进行拆分,即分成几次传输,等到下次连接时将会改变一次发包的数据大小为2048字节,然后下次增长为3072字节,然后下次增长为4096字节;然而,再往下增长,则增长了2048字节变为6144字节,然后变为8192字节(8KB),当数据再大时,接收到的原创 2017-09-02 11:09:11 · 1698 阅读 · 0 评论 -
设计模式——动态代理
之前讲过,静态代理的两个缺点:1. 需要手动建立代理类,当需要代理的对象增多时,会创建多个代理类 2. 代理与被代理对象实现同一接口,对象间耦合度太高。那么动态代理是如何解决这两个问题的呢? 1. 动态代理简介:首先先说个结论,动态代理主要是通过反射机制动态创建的。JDK的reflect包中提供了Proxy类来获得动态代理,Proxy类中有一个非常重要的方法Proxy.ne原创 2017-10-14 11:16:40 · 243 阅读 · 0 评论 -
设计模式——装饰者模式
在学习设计模式的时候,发现装饰这模式和代理模式在某些地方是很相像的,那么具体又有什么区别和联系呢?让我们根据实例来看一看:1. 装饰者模式: 百度百科上说:装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 其实装饰者模式顾名思义,就是可以给一个对象动态增加新的功能。使用装原创 2017-09-15 15:59:00 · 472 阅读 · 0 评论 -
设计模式——代理模式介绍及与装饰者模式的区别
这次来总结下代理模式(静态代理以及动态代理)的使用,以及与装饰器模式的区别:1. 代理(静态代理)模式: 1.1 简介 通俗地讲,代理模式就是提供一个代理,代替实际对象完成某些操作,从而控制对实际对象的访问。比如在实际生活中,我们需要买车,当客户不能或者不想直接去进行交易时,那么就需要一个中介——也就是代理,去帮客户去完成买车的操作,而客户并不需要去关注具体原创 2017-10-13 16:48:11 · 2158 阅读 · 2 评论 -
设计模式——观察者模式
观察者模式又叫发布订阅模式,定义了对象间一对多的依赖关系。当一个对象发生变化,其他依赖此对象的对象们都会被通知,然后随之产生变化。举个栗子,当我们关注了某个人的博客(相当于订阅),当此博客有更新(发布了新文章),那么关注此博客的用户都会收到类似“您关注的博客有更新”这样的消息。诸如此类的模式就是观察者。 1. 观察者模式组成:- 抽象主题:主题中包含了观察者的集合。并提供添加,原创 2017-11-12 15:24:26 · 260 阅读 · 0 评论 -
设计模式——单例模式的几种写法
一、单例模式单例模式是一种创建型的模式,指某个类采用单例模式后,在这个类被创建后,只产生一个实例以供外部访问,且提供一个全局的访问点。单例模式在开发中具有相当大的重要性,并且代码实现相对简洁。所以其是为数不多的在面试中会被问到且要求手撸代码的设计模式哦:)。 二、几种单例的写法及比较1. 饱汉模式package designpatterns.sing原创 2017-12-08 13:53:16 · 310 阅读 · 0 评论 -
设计模式——适配器模式
定义:适配器模式即是将某个类的接口转换成客户端期望的另一个接口,使原本接口不匹配的两个类能一起正常工作,目的就是消除由于接口不匹配所造成的类的兼容性。一般来说,接口不兼容的类一般具有相类似的功能。比较直白的做法是通过修改类的接口来解决接口不兼容的问题。但是,一来修改接口这种方案是不符合设计模式的“开闭原则”(Open Close Principle)的,即“对扩展开放,对修改关闭”,修原创 2017-11-30 18:53:36 · 377 阅读 · 0 评论 -
设计模式——外观模式
一、定义:如果有一个系统,内部分为三个子系统:S1,S2,S3,当用户A调用了子系统S1,S2的接口,用户B也调用了子系统S1,S2的接口。那么当子系统S1,S2发生变化时,它们将会影响到所有调用了子系统的客户,子系统与用户的直接交互无疑使他们之间高度耦合,这个时候用外观模式就是很合适的。外观模式将子系统的接口集成在一个高层接口中,使用者可以直接调用高层的接口而忽略其内部子系统的变化,原创 2017-12-01 11:43:15 · 210 阅读 · 0 评论 -
设计模式——组合模式
一、什么是组合模式?让我们想象一个场景,原本我们在网上买东西是一件一件支付的,享受的折扣也只有店家提供的满减红包,但是在双十一的时候,退出了“跨店满减”活动,这个时候我们需要把要购买的商品打包一起支付以享受更加优惠的折扣。这就是典型的组合模式的一个运用。组合模式将对象组成树形结构,使得用户对于单个对象和组合对象的使用一致。组合模式有时又叫“部分-整体模式”,消除了单个对象与组合对象在使原创 2017-12-02 18:46:57 · 453 阅读 · 0 评论 -
设计模式——桥接模式
一、什么是桥接模式?《大话设计模式》中有一个场景:当我们要进行绘画时,有两种选择:蜡笔和水彩。蜡笔是将笔和颜料混合在一起成为了一个整体,那么如果我们需要大号、中号、小号各12种颜色的蜡笔,总共36支,这无疑是一笔很大的花费,那么如果使用水彩呢?水彩用的是毛笔,我们只需要大中小三支毛笔,以及12种需要的颜料就可以完成这项任务,这样总共只需要15种物品,大大减少了需要的物品数目。这就是典型的桥接模原创 2017-12-04 10:26:56 · 431 阅读 · 1 评论 -
设计模式——抽象工厂模式及与工厂模式的区别
一、什么是抽象工厂模式? 抽象工厂模式提供一个创建一系列相关或相互依赖的对象的接口,而无需指定它们具体的类。这样的描述我们会觉得和工厂模式比较像,那么工厂模式和抽象工厂模式的区别是什么呢?这两种设计模式主要的区别在于产品,工厂模式是用来创建同一个产品的不同类型的(详情请看上一篇博客中卖包子的案例,大肉包和牛肉包它们都是包子的不同类型展示),但是抽象工厂模式是用来创建不同类的产品原创 2017-12-21 11:08:25 · 15310 阅读 · 11 评论 -
开发概述——退款记录导出至excel
最近做了一个(奇坑的)需求,用户退款信息导出至excel。听起来似乎是一个简单的小功能,但是做起来却发现有数不清的大坑- -,整个项目我大约花了2-3周时间去开发(当然中间穿插着一些其他的需求),并后续仍在优化或解决bug。不过现在已经完成,大部份的坑也已经被填满了。首先来说下整体的开发流程图:对于这个需求,首先我们需要明确一点:必须要异步来做,导出任务很耗时间(当记录较多时,时间会比较长),如果...原创 2018-07-08 11:21:16 · 939 阅读 · 0 评论