
设计模式
hello_读书就是赚钱
2020年12月加入某头部互联网公司,担任高级开发工程师,从事公司核心软件开发/
2017年6月加入某1000人+软件公司,担任中级架构师从事公司核心软件项目开发,分布式架构研究、部署,生产环境维护等工作
展开
-
一头扎进设计模式-单例模式
定义:单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例用自己的话说:保证全局只有一个对象,即不提供公用的构造方法,通过一个公用的方法返回具体的实例。代码:/** * */ package com.jjt.singleton;/** * @author jiangjintai * */ public class S原创 2016-09-09 14:25:00 · 418 阅读 · 0 评论 -
MultipartFile-使用策略模式实现可拓展文件分类上传
引子: 想起以前第一个项目的时候,常常使用apache的fileUploadutil,感觉效果很不好,又不容易实现一个上传的过程。 后来使用了spring提供的MultipartFile上传机制,将少了很多复杂的处理过程。但是随着业务逻辑的复杂,对于文件的分类那时候处理得比较困难,比如上传一个图片,还是pdf,还是doc,图片多大?pdf多大?分别存储的路径在哪?如果是图片要压缩怎么办?等等,原创 2016-09-23 14:42:48 · 2516 阅读 · 0 评论 -
一头扎进设计模式-抽象工厂模式
定义:抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。换言之,也就原创 2016-09-09 14:14:02 · 350 阅读 · 0 评论 -
各用一句话描述23种设计模式
Abstract Factory(抽象工厂):提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们的具体的类。Adapter(适配器):将一个类的接口转换成调用者希望的另外一个接口。适配器模式是的原本由于接口不兼容而不能在一起工作的那些类可以一起工作。Bridge(桥接):将抽象部分与他的实现部分分离,使他们都可以独立的变化。比如在实体类里面使用聚合,该聚合的属性为抽象的,可以动态改变其真正的原创 2016-09-06 16:09:07 · 2694 阅读 · 0 评论 -
一头扎进设计模式-策略模式
定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。用自己的话说:把算法封装好在类里面,通过组合的方式进行算法切换。代码: 定义一个鸭子接口:public abstract class Duck { //今天开始学习设计模式,策略模式实现鸭子的飞,叫灵活功能 private Fly flier; p原创 2016-09-18 14:56:48 · 376 阅读 · 0 评论 -
一头扎进设计模式-状态模式
定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。用自己的话说:把每个状态的具体行为封装的具体的某个类中,让状态类代替主体是实现一些操作。代码: 定义一个状态接口类public interface State { //插入原创 2016-09-18 14:22:54 · 362 阅读 · 0 评论 -
一头扎进设计模式-观察者模式
定义:观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。用自己的话说:思想是往观察者里面注入主体,但原创 2016-09-18 11:14:56 · 343 阅读 · 0 评论 -
一头扎进设计模式-迭代器模式
定义:迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。用自己的话说:封装了列表对象,不把底层的东西暴露给用户,注意:每次获取迭代器的时候,都会取到一个新的迭代器,所以记得不能直接取着用。代码: 首先,我们定义一个迭代器接口:public interface OfferIterator { Iterator<String> itera原创 2016-09-18 10:16:08 · 310 阅读 · 0 评论 -
一头扎进设计模式-命令模式
定义:命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。用自己的话说:把真正操作的实体封装到命令里面,通过命令对实体进行真正的操作。代码: 定义一个真正操作的实体类:public class GarageDoor { public void up(){ System.out.p原创 2016-09-13 16:24:33 · 287 阅读 · 0 评论 -
一头扎进设计模式-模版模式
定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情冴下,重新定义算法中的某些步骤。用自己的话:把算法的步骤,困难的实现,通用的实现都在父类里面规定好,把特殊的实现交给子类,达到一个复用的效果。”不用打给我,我会打给你”,子类中的方法不能访问上层类的东西,好莱坞原则代码: 定义一个泡茶抽象类:public abstract class MakeT原创 2016-09-13 11:53:40 · 281 阅读 · 0 评论 -
一头扎进设计模式-代理模式
定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。用自己的话说:把真正运行的类封装到代理类里面,当实际调用时通过代理类去调用,代理类与真正运行的类实现同一套接口,代理类可以在真正操纵前对动作进行一些处理,适用为 远程代理:远程链接时,通过代理类隐藏网络获取等相关动作。 虚拟代理:使用代理原创 2016-09-13 11:27:39 · 302 阅读 · 0 评论 -
一头扎进设计模式-外观模式
定义:外观模式(Facade),为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。用自己的话:把所有操作复杂的类集合到一起,提供一个容易操作的接口代码: 定义一个灯类:public class Light { public void openLight() { System.out.println("开灯"); }原创 2016-09-13 11:09:11 · 451 阅读 · 0 评论 -
一头扎进设计模式-装饰者模式
定义:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。用自己的话说:装饰者与被装饰者实现同一个接口,把被装饰者当为参数传递到装饰者中,由装饰者进行粉饰调用,用户面向装饰者代码: 定义一个抽象饮料类public abstract class Beverage { //抽象饮料类 String description原创 2016-09-12 16:37:51 · 317 阅读 · 0 评论 -
一头扎进设计模式-组合模式
定义:组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 “组合对象” 的含义。用自己的话说:使用该模式把类组合成类似树的结构,树的结点与树的子叶共同继承同一个抽象类。相对于用户来说,树的结点和树的子叶都是一样的,然后通过迭代器进行操作等等…代码: 定义一个菜单抽原创 2016-09-12 16:15:12 · 339 阅读 · 0 评论 -
一头扎进设计模式-适配器模式
定义:定义为将一个类的接口变换成客户端所期待的一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。用自己的话说:通过一个中间类进行接口转换,把一个接口转换成另外一个接口代码: 定义一个鸭子接口:public interface Duck { //这是一个鸭接口,适配器要以该接口作为目标进行适配 void quack();//鸭子呱呱叫 void fly(原创 2016-09-12 15:58:48 · 358 阅读 · 0 评论 -
VO(DTO)存在的必要性,以及使用工厂模式+模版模式+自省实现可拓展VO
引子: 想起以前第一个项目的时候,使用springMvc+mybatis+restful实现一个论坛的网站,那个时候因为还不知道VO层的存在(因为一直使用MVC三层架构)。为了不想重复写get,set方法(把po的数据封装到map或者新的bean),所以直接从数据库里面读取出来的po就直接封装成json反馈到前端,很多重要的数据字段如用户密码这些都直接抛给前端,数据泄漏了出去。 后来使用原创 2016-09-01 18:15:48 · 12197 阅读 · 7 评论