![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java开发
大雨将至
后知后觉, 也许不算晚
展开
-
Spring中的设计模式
1 简单工厂模式用途 BeanFactory简单来说就是让工厂给我生产一个类,具体生产的是哪个子类实例,我并不不关心User user = (User) beanFactory.getBean("user");2 工厂方法模式用途 FactoryBean简单工厂模式是让工厂生产一个类,而工厂方法模式需要先建造一个工厂,然后用它来生产自己需要的类。class User...原创 2020-03-03 21:20:37 · 564 阅读 · 1 评论 -
重温设计模式之中介者模式
中介者模式 Mediator Pattern用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。生活中我们经常会需要中介,比如租房找房产中介要比自己找要方便的多。再如订外卖,如果没有外卖平台,就要保存很多的外卖菜单,即使这样也会因为消息不及时而错过一些新店开业的优惠。而对餐馆来说,想加几样新菜要么是等别人订餐...原创 2019-11-02 16:43:53 · 437 阅读 · 0 评论 -
重温设计模式之命令模式
命令模式 Command Pattern将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。小明的西餐店正式开业了,为了提高点餐体验和效率,他凭借程序员的经验,引入设计模式来设计点餐流程。这次,用到的是命令模式。看图:命令模式的优点是降低请求者(Waiter)和接收者(Chef)的耦合度,服务员知道菜单就可以了,...原创 2019-10-29 20:15:39 · 279 阅读 · 0 评论 -
重温设计模式之备忘录模式
备忘录模式 Memento Pattern在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。小明开披萨外卖店攒了一点钱,开始动心想开一家真正的西餐厅,不过这是一笔大投资,弄不好会赔掉全部积蓄,还要搭上时间。如果人生失败后能重来就好了。正在纠结的时候,忽然天上来了一位仙人,对他说:孩子,你尽管大胆的去尝试吧,如果失败了,我来帮你回到现在。嗯,让我先保...原创 2019-10-24 23:22:10 · 222 阅读 · 0 评论 -
重温设计模式之桥接模式
桥接模式 Bridge Pattern将抽象部分与实现部分分离,使它们都可以独立的变化。小明的披萨外卖店生意越来越好,制作披萨的速度已经赶不上订单的速度,小明决定买几台自动披萨机来代替人工。一番考察后,M品牌的披萨机和符合小明的需求。它有制作不同口味的多种机器,每种机器都可以更换大中小三种烤箱,分别烤出12寸、9寸和6寸的披萨。以后如果有新口味的要求,再买一台新披萨机就可以,原来的...原创 2019-10-24 20:06:15 · 228 阅读 · 0 评论 -
重温设计模式之状态模式
状态模式 State Pattern允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。在生产流水线上,每个岗位的工人完成自己的步骤后,产品状态发生变化,工人会交给下一环节处理。如果用代码来描述一条披萨生产流水线,可以用状态模式。Pizza类为Context角色,它封装了客户端感兴趣的处理和查看状态接口,并将与状态相关的操作委托给当前状态对象(Cook)来处理。...原创 2019-10-23 23:05:44 · 224 阅读 · 0 评论 -
重温设计模式之模板方法模式
模板方法模式 Template Pattern定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。回到小明的披萨店。见建造者模式经营一段时间后,小明开始思考如何降低人力成本,他意识到,如果能够通过规则保证每个步骤的正确执行,就不需要额外的监督员;而且制作披萨的加芝士和烘焙步骤,两种披萨是一样的,是否可以考虑合...原创 2019-10-21 11:07:30 · 227 阅读 · 0 评论 -
重温设计模式之适配器模式
适配器模式 Adapter Pattern将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。中国的标准电压是220V,但是很多国家如美国、日本是110V,去这些国家旅行时为了能给手机等设备充电,需要准备一个转换器,把110V电压转换为220V电压,这就是一种适配器模式。那么在外观模式中提到的万能读卡器算不算适配器模式呢?...原创 2019-10-20 12:14:19 · 189 阅读 · 0 评论 -
重温设计模式之组合模式
组合模式 Composite Pattern将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。组合模式用于构建树形结构,如文件目录、组织关系等。关键代码是继承父类并且包含一个父类的集合。UML图:代码:import java.util.ArrayList;import java.util.List;publ...原创 2019-10-19 20:41:52 · 217 阅读 · 0 评论 -
重温设计模式之代理模式
代理模式 Proxy Pattern为其他对象提供一种代理以控制对这个对象的访问。在部署Web应用时,通常都会使用Nginx作为反向代理,这种模式下,在浏览器看来把HTTP请求发给Nginx和Tomcat得到的结果是相同的。UML图:代码:public interface WebServer { String getHttp();}public clas...原创 2019-10-17 21:16:18 · 188 阅读 · 0 评论 -
重温设计模式之外观模式
外观模式 或称门面模式Facade Pattern为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。万能读卡器是一个外观模式在生活中的应用。便携存储卡有SD卡、CF卡、TF卡等多种类型,想让电脑支持所有的卡类型,需要预设一排各种各样的接口。使用万能读卡器后,只要设置USB接口就可以了。如果用代码来描述这一过程,就是标准的...原创 2019-10-17 20:29:40 · 188 阅读 · 0 评论 -
重温设计模式之原型模式
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。如果玩过魔兽争霸3都知道剑圣有一个技能叫镜像,分裂出两个和自身属性一样的假剑圣,只是没有攻击力。考虑一下创建假剑圣的过程,剑圣有等级、力量、敏捷、智力等可变属性,如果用new的方式创建,则需要把每个属性重新设置一遍。BladeMaster fake1 = new BladeMaster();fake1.setLeve...原创 2019-10-16 19:27:16 · 188 阅读 · 0 评论 -
重温设计模式之观察者模式
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。需求:在用户上线时,有各种各样的事情要处理:发一封欢迎信、增加登录积分、查询未读邮件数做提示、提醒修改密码,并且随时会增加新的需求或者删除过时功能。UML图:代码:public class LoginEvent extends EventObject { pub...原创 2019-10-15 21:15:24 · 189 阅读 · 0 评论 -
重温设计模式之建造者模式
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。看做外卖生意赚钱容易,小明也开了一家披萨外卖店。做披萨通常需要制作面饼、加馅料、加调味酱、加芝士和烘焙5个步骤,为了提高效率,小明组建了“披萨流水线”,每条流水线5个人,分别负责5个步骤;两组流水线分别制作水果披萨和海鲜披萨。为了协调流水线的生成,保证每个步骤都被执行到位,小明又聘请了专门的监督员来监督整个制作过程。...原创 2019-10-14 20:49:40 · 234 阅读 · 0 评论 -
重温设计模式之策略模式
定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。假设需求是做数组排序,但是需求方并没有想好用哪种算法,为了应对自如,我们先写好冒泡、归并和快速三种算法,并且通过设计模式让客户端可以随意替换。UML图:代码:public interface Sorter { void sort(int[] numbers);}public class B...原创 2019-10-13 18:32:06 · 222 阅读 · 0 评论 -
重温设计模式之装饰(器)模式
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。以用滤镜处理图片的行为模式为例,其特点是:1 滤镜有多种且可持续增加新类型2 用户加滤镜的顺序是随机的3 每次加滤镜需要叠加之前滤镜的效果如果用装饰模式来表现,那么UML图是:代码:public interface Picture { void show();}pub...原创 2019-10-12 10:55:09 · 183 阅读 · 0 评论 -
重温设计模式之单例模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点。UML图:实现代码:懒汉式public class LazySingleton { private static LazySingleton instance; private static Object lock = new Object(); private LazySingleton()...原创 2019-10-11 20:49:48 · 193 阅读 · 0 评论 -
循序渐进之Spring AOP(1) - 原理
AOP全称是Aspect Oriented Programing,通常译为面向切面编程。利用AOP可以对面向对象编程做很好的补充。用生活中的改装车比喻,工厂用面向对象的方法制造好汽车后,车主往往有些个性化的想法,但是又不想对车进行大规模的拆卸、替换零件,这时可以买一些可替换的零件、装饰安装到汽车上,并且这些改装应该很容易拆卸,以避免验车时无法通过。原创 2016-04-05 21:39:15 · 11055 阅读 · 2 评论 -
使用quartz实现不重启服务器修改自定义配置
为了方便维护系统,开发中通常会设置一些自定义参数,写在单独的配置文件里,需要调整时可直接登录服务器修复配置文件,而不需要修改程序。但尴尬的是,web服务器并不会自动重新加载配置文件,重启服务器又会中断服务。本文是一个使用quartz解决此问题的示例。项目结构:其中,system.properties是自定义配置文件,内容只有一行:debug=false这个定义了一个debug参原创 2017-01-17 15:12:17 · 3772 阅读 · 0 评论 -
RocketMQ教程(一) - 基础
目录(一)基础(二)进阶(三)高可用部署(四)常见问题正文1. 下载http://rocketmq.apache.org/dowloading/releases/选择Binary包这里解压缩后放到了D盘, 且为了操作方便, 把文件夹从rocketmq-all-4.5.0-bin-release改名为RocketMQ默认设置占用内存很大, 如果不是土豪配置需要修改一下...原创 2019-04-12 11:38:13 · 33410 阅读 · 9 评论 -
重温设计模式之(简单)工厂模式
定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。常用场景: 多数据库实现、多种媒介的日志记录UML图:代码:public interface EmployeeDao { Employee selectById(int id);}public class EmployeeDaoMsSQLImpl imple...原创 2019-09-26 14:55:03 · 168 阅读 · 0 评论 -
重温设计模式之工厂(方法)模式
在简单工厂模式中,当增加新的实体对象时,需要修改工厂类的switch代码块,容易出错,违反开放-封闭原则。针对于此,可以改成为每个实体对象创建一个工厂类,即为工厂(方法)模式。UML图:代码:public interface EmployeeDao { Employee selectById(int id);}public class EmployeeDao...原创 2019-10-08 14:41:16 · 229 阅读 · 0 评论 -
重温设计模式之抽象工厂模式
在使用工厂方法模式时,如果工厂很多,那么在变更子类类型时就要修改多个工厂,复杂且容易出错。一个解决办法就是使用抽象工厂模式,建造一个生产工厂的工厂。抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。UML图:代码:public interface EmployeeDao { Employee selectById(int id);}...原创 2019-10-09 18:51:17 · 234 阅读 · 0 评论 -
在IDEA中实战Git
工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下:假设小组中有两个人,组长小张,组员小袁场景一:小张创建项目并提交到远程Git仓库场景二:小袁从远程Git仓库上获取项目源码场景三:小袁修改了部分源码,提交到远程仓库场景四:小张从远程仓库获取小袁的提交场景五:小袁接受了一个新功能的任务,创建了一个分支并在分支上开发场景六:小袁把分支提交到远程Git仓库场景七...原创 2016-09-12 17:56:59 · 177347 阅读 · 69 评论 -
Maven适配多种运行环境的打包方案
项目从开发到部署会历经多个运行环境,如开发环境、测试环境和生产环境,不同环境中项目的配置文件通常也会不同,典型的如数据库连接配置。我们当然不希望每次部署打包前都去修改配置文件以适配环境,利用Maven的Profile和资源过滤,可以实现自动按环境设置调整配置文件。原创 2016-08-04 09:56:26 · 2226 阅读 · 0 评论 -
循序渐进之Spring AOP(3) - 配置代理
上一篇介绍了几种Advice(增强),并通过代码演示了生成代理的方式,下面来看通过配置文件配置方式把Advice织入目标类。注意,配置文件方式仍然不是Spring AOP的最好方式,学习配置方式也是为了循序渐进的掌握内核技术。原创 2016-04-11 09:19:13 · 9765 阅读 · 1 评论 -
循序渐进之Spring AOP(2) - 基本概念
学习AOP前要先了解几个重要术语:Joinpoint、Pointcut、Advice仍然以改装车比喻,拿到心爱的汽车后想做改装,第一件事是什么?找到要改装的地方。车上可改装的地方很多,但每个人感兴趣的点并不一样,有人改装车灯,有人改装轮毂,也有人同时都改,确定位置后装上零件、装饰,就完成了一次"AOP"。在上面的比喻中,可改装的地方可以看做是连接点(Joinpoint),如类的某个方法调用原创 2016-04-08 23:38:35 · 10140 阅读 · 1 评论 -
通俗的解释JAVA wait/notify机制
生活中,我们常遇到需要等待的场景,例如去银行办事,在没轮到自己之前需要一直等待,但是如果需要自己每隔几秒钟就去柜台前看看状况,那肯定是种非常低效和令人恼火的体验。而实际的情况是,接待员会让您拿个号,说"请稍等一会"(wait); 当排到时,语言和大屏幕会提示"请XXX号到N号柜台办理"(notify)。wait/notify机制也正是处理这样的场景:线程继续执行需要等待某个条件的变化,这个条件由另一个人任务改变,如果一直空循环检查条件变化,是一种不良的CPU使用方式,这时候可以wait()将任务挂起,在其原创 2016-03-28 14:26:44 · 1848 阅读 · 0 评论 -
详解log4j2(下) - Async/MongoDB/Flume Appender 按日志级别区分文件输出
按日志级别区分文件输出异步写日志输出到MongoDB输出到Flume原创 2016-04-25 20:23:20 · 17607 阅读 · 5 评论 -
开发高性能JAVA应用程序基础(集合篇)
集合类在开发中使用非常频繁,使用时合理的选择对提高性能小有帮助。而且大部分面试都会有与集合相关的问题,例如ArrayList和LinkedList的对比。了解API的集成与操作架构,才能了解何时该采用哪个类,本文也尝试用一些现实生活中的物品来比喻各个集合类的特性,仅仅是帮助记忆,数据结构高手不必太过较真。原创 2016-03-23 20:46:11 · 10891 阅读 · 1 评论 -
循序渐进之Maven(4) - 第一个SpringMVC项目
上一篇完成了Maven web项目的搭建,本篇在其基础上改造为Spring MVC项目,这一步骤比较简单。为了尽量使配置看起来简单清晰,仅添加了最基础的依赖包。原创 2016-04-01 11:16:31 · 9564 阅读 · 0 评论 -
循序渐进之Maven(3) - 第一个Web项目
一步步演示搭建Maven web项目原创 2016-03-30 20:29:54 · 9826 阅读 · 0 评论 -
循序渐进之Maven(2) - 第一个Maven项目
一步步演示创建第一个Maven项目原创 2016-03-29 21:00:56 · 9331 阅读 · 0 评论 -
循序渐进之Maven(1) - 搭建环境
一步步演示搭建Maven环境原创 2016-03-29 20:28:40 · 9756 阅读 · 0 评论 -
循序渐进之Spring AOP(4) - Introduction
前面描述的几种增强(Advice)都是在目标方法范围内织入,而引介(Introduction)不同,直接在类级别上添加目标未实现的接口方法。在Spring中可以通过扩展DelegatingIntroductionInterceptor类来实现引介增强类。原创 2016-04-11 21:09:55 · 12728 阅读 · 3 评论 -
Spring JDBC常用方法详细示例
Spring JDBC使用简单,代码简洁明了,非常适合快速开发的小型项目。下面对开发中常用的增删改查等方法逐一示例说明使用方法原创 2016-04-29 23:39:58 · 11838 阅读 · 1 评论 -
循序渐进之Spring AOP(5) - 创建切面
在掌握了可用的Advice后,接下来要做的就是精确的描述切点。前面的示例都是指定一个目标类并把增强织入到所有方法中,实际开发显然会有更多的选择可能性,比如对所有类中名称以test结尾的方法加入监控执行时间,或者指定某些方法仅在输入参数是指定值时做某些特殊处理以解决临时性需求。原创 2016-04-17 14:59:33 · 10348 阅读 · 1 评论 -
使用ZooKeeper实现软负载均衡(原理)
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,提供的功能包括配置维护、名字服务、分布式同步、组服务等。ZooKeeper会维护一个树形的数据结构,类似于Windows资源管理器目录,其中EPHEMERAL类型的节点会随着创建它的客户端断开而被删除,利用这个特性很容易实现软负载均衡。基本原理是,每个应用的Server启动时创建一个EPHEMERAL节点,应用客户端通过读原创 2016-06-03 11:40:32 · 25383 阅读 · 8 评论 -
从头开始基于Maven搭建SpringMVC+Mybatis项目(3)
接上文内容,本节介绍基于Mybatis的查询和分页功能,并展示一个自定义的分页标签,可重复使用以简化JSP页面的开发。在上一节中,我们已经使用Maven搭建好了项目的基础结构,包括一个父项目petstore-parent和数据库持久层模块petstore-persist及Web站点petstore-web,现在来为petstore-web添加一些功能。对于初学者来说,可能原创 2016-07-26 10:06:44 · 43876 阅读 · 3 评论 -
从头开始基于Maven搭建SpringMVC+Mybatis项目(4)
接上文内容,上一节中的示例中完成了支持分页的商品列表查询功能,不过我们的目标是打造一个商品管理后台,本节中还需要补充添加、修改、删除商品的功能,这些功能依靠Mybatis操作数据库,并通过SpringMVC的数据验证功能检查数据合法性。既然是后台,那么肯定还需要验证和登录,这部分使用拦截器(interceptor)来实现。此外,我们还需要解决诸如中文处理、静态资源过滤等经常会造成麻烦的小问题。原创 2016-07-27 16:53:42 · 9880 阅读 · 0 评论