Java设计模式
设计模式主要分三个类型:创建型、结构型和行为型。 本博客将介绍java中使用到的23种设计模式,包括应用场景、概念、以及使用例子等
Master.TJ
https://github.com/fengruotj
展开
-
Java设计模式(二十三):访问者设计模式
1. 应用场景对于系统中的某些对象,它们存储在同一个集合中,且具有不同的类型,而且对于该集合中的对象,可以接受一类称为访问者的对象来访问,而且不同的访问者其访问方式有所不同,访问者模式为解决这类问题而诞生。在实际使用时,对同一集合对象的操作并不是唯一的,对相同的元素对象可能存在多种不同的操作方式。而且这些操作方式并不稳定,可能还需要增加新的操作,以满足新的业务需求。此时,访问者模式就是一个值得...原创 2019-01-08 11:46:27 · 437 阅读 · 0 评论 -
Java设计模式(二十二):原型设计模式
1. 应用场景如果一个对象的创建总是由几种固定组件不同方式组合而成; 如果对象之间仅仅实例属性不同。将不同情况的对象缓存起来,直接克隆使用。也许这比采用传递参数重新 new 一个对象要来的快一些与工厂模式的区别:原型模式相当于”改进版的工厂模式”:对象实现了Clonnable()接口,加入了 java 反射机制,去掉了工厂模式繁多的子类2.概念使用原型实例指定要创建对象的类型,通过复制这个原...原创 2019-01-08 11:45:48 · 413 阅读 · 0 评论 -
Java设计模式(二十一):备忘录设计模式
1. 应用场景备忘录模式经常可以遇到,譬如下面这些场景:浏览器回退:浏览器一般有浏览记录,当我们在一个网页上点击几次链接之后,可在左上角点击左箭头回退到上一次的页面,然后也可以点击右箭头重新回到当前页面数据库备份与还原:一般的数据库都支持备份与还原操作,备份即将当前已有的数据或者记录保留,还原即将已经保留的数据恢复到对应的表中编辑器撤销与重做:在编辑器上编辑文字,写错时可以按快捷键 Ct...原创 2019-01-08 11:45:21 · 502 阅读 · 0 评论 -
Java设计模式(二十):中介者设计模式
1.应用场景世界上存在着各种各样的数据库,不同数据库有各自的应用场景,对于同一份数据,最开始可能使用关系型数据库(如MySQL)进行存储查询,使用Redis作为缓存数据库,当数据量较大时使用MySQL进行查询可能较慢,所以需要将数据同步到Elasticsearch或者列式数据库如Hbase中进行大数据查询。如何设计数据同步方案是一个重要的问题。数据源众多,目标端也众多,设计得不好可能 “牵一发而...原创 2019-01-08 11:44:42 · 537 阅读 · 0 评论 -
Java设计模式(十九):解释器设计模式
1. 应用场景给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。(如:360读取lua脚本,这个细节的实现就是解释器模式)2.概念为语言创建解释器,通常由语言的语法和语法分析来定义。3. Class DiagramTerminalExpression:终结符表达式,每个终结符都需要一个 TerminalExpre...原创 2019-01-08 11:43:06 · 616 阅读 · 0 评论 -
Java设计模式(十八):享元设计模式
1. 应用场景当我们项目中创建很多对象,而且这些对象存在许多相同模块,这时,我们可以将这些相同的模块提取出来采用享元模式生成单一对象,再使用这个对象与之前的诸多对象进行配合使用,这样无疑会节省很多空间。2. 概念说到享元模式,第一个想到的应该就是池技术了,String常量池、数据库连接池、缓冲池等等都是享元模式的应用,所以说享元模式是池技术的重要实现方式。比如我们每次创建字符串对象时,都需...原创 2019-01-08 11:42:34 · 472 阅读 · 0 评论 -
Java设计模式(十七):责任链设计模式
1. 应用场景一场足球赛,A队的2个组成队a、b。a队踢上半场,踢完后交给b队踢下半场,一起完成这场球赛。吃一条鱼:妈妈吃鱼头,吃完让儿子吃鱼身体,吃完给爸爸吃鱼尾巴。Servlet容器的过滤器责任链就是这样有一条执行链来完成一件事。2. 概念使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链发送该请求,直到有一个对象处理它为...原创 2019-01-08 11:41:53 · 455 阅读 · 0 评论 -
Java设计模式(十六):生成器设计模式
1.应用场景在软件的设计中,我们可能经常会遇到需要构建某个复杂的对象(比如在游戏开发中,进行人物角色的构建),建造该对象的“过程”是稳定的(对于一个人设来都有身体,脸,发型,手脚等),而具体建造的“细节”是不同的(每个人设的身体,脸等各有千秋)。但对于用户来讲,我才不管这些,我只想告诉你,我现在需要某个对象(拥有某特征的人物角色),于是你就创建一个给我就行了。如果你需要将一个复杂对象的 构建与...原创 2019-01-08 11:40:50 · 556 阅读 · 1 评论 -
Java设计模式(十五):桥接设计模式
1. 应用场景假如你正在为一个新的人体工学且友好的电视遥控器编程。你要使用好的OO技能,让所有的遥控器都基于相同的抽象,对此抽象又做出不同的实现—每部不同型号的电视机都有自己的遥控器的实现。2. 概念使用桥接设计模式,不只改变你的实现,也改变你的抽象。将抽象与实现分离开来,使它们可以独立变化。3.Class DiagramAbstraction:定义抽象类的接口Implementor...原创 2019-01-08 11:40:15 · 468 阅读 · 0 评论 -
Java设计模式:设计模式基础知识和原则
设计模式概念模式是在某种情景下(Context)下,针对某问题的设计的某种解决方案。情景:是应用某个模式的情况。这应该是会不断出现的情况。问题:是你想在某情景下达到的目标,但也是某种情景下的约束解决方案:是你所求的一个通用的设计,可用来解决约束,达到目标。分类模式可以分为以下三种不同的类别:创建型、行为型和结构型。创建型:创建型模式涉及到对象实例化,这类模式都提供一个方...原创 2019-01-07 20:19:27 · 499 阅读 · 0 评论 -
Java设计模式(十四):MVC设计模式
1. 应用场景MVC设计模式广泛应用于桌面应用程序开发和网页页面开发这些与用户交互的应用场景中。2.概念众所周知MVC不是设计模式,是一个比设计模式更大一点的模式,称作设计模式不合理,应该说MVC它是一种软件开发架构模式,它包含了很多的设计模式,最为密切是以下三种:Observer (观察者模式), Composite(组合模式)和Strategy(策略模式)。所以说MVC模式又称复合模式。...原创 2019-01-07 19:42:55 · 1224 阅读 · 1 评论 -
Java设计模式(十三):代理设计模式
代理模式可以分为以下四类远程代理(Remote Proxy):控制对远程对象(不同地址空间)的访问,它负责将请求及其参数进行编码,并向不同地址空间中的对象发送已经编码的请求。虚拟代理(Virtual Proxy):根据需要创建开销很大的对象,它可以缓存实体的附加信息,以便延迟对它的访问,例如在网站加载一个很大图片时,不能马上完成,可以用虚拟代理缓存图片的大小信息,然后生成一张临时图片代替原始...原创 2019-01-07 16:09:38 · 554 阅读 · 0 评论 -
Java设计模式(十二):状态设计模式
1.应用场景在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理。最直接的解决方案是将这些所有可能发生的情况全都考虑到。然后使用if… ellse语句来做状态判断来进行不同情况的处理。但是对复杂状态的判断就显得“力不从心了”。随着增加新的状态或者修改一个状体(if else(或switch case)语句的增多或者修改)可能会引起很大的修改,而程序的可读性,扩展性也会变得很弱。维护也会很...原创 2019-01-06 20:18:32 · 531 阅读 · 0 评论 -
Java设计模式(十一):组合设计模式
1. 应用场景这种组合模式正是应树形结构而生,所以组合模式的使用场景就是出现树形结构的地方。比如:文件目录显示,多及目录呈现等树形结构数据的操作。2. 概念将对象组合成树形结构来表示“整体/部分”层次关系,允许用户以相同的方式处理单独对象和组合对象。3. Class Diagram组件(Component)类是组合类(Composite)和叶子类(Leaf)的父类,可以把组合类看成是树的...原创 2019-01-06 18:34:04 · 918 阅读 · 1 评论 -
Java设计模式(十):迭代器设计模式
1.应用场景(1)访问一个聚合对象的内容而无需暴露它的内部表示(2)支持对聚合对象的多种遍历(3)为遍历不同的聚合结构提供一个统一的接口2.概念提供一种顺序访问聚合对象元素的方法,并且不暴露聚合对象的内部表示。这个模式给使用者提供了一种方法,可以顺序访问一个聚集对象中的元素,而又不用知道内部是如何表示的。3. Class DigramAggregate 是聚合类,其中 create...原创 2019-01-05 16:48:49 · 513 阅读 · 0 评论 -
Java设计模式(九):模板方法设计模式
1. 应用场景模板模式就是通过抽象类来定义一个逻辑模板,逻辑框架、逻辑原型,然后将无法决定的部分抽象成抽象类交由子类来实现,一般这些抽象类的调用逻辑还是在抽象类中完成的。这么看来,模板就是定义一个框架,比如盖房子,我们定义一个模板:房子要封闭,有门,有窗等等,但是要什么样的门,什么样的窗,这些并不在模板中描述,这个交给子类来完善,比如门使用防盗门,窗使用北向的窗等等。2. 概念定义算法框架,...原创 2019-01-04 16:29:13 · 477 阅读 · 0 评论 -
Java设计模式(八):外观设计模式
1. 应用场景当我们访问的子系统拥有复杂额结构,内部调用繁杂,初接触者根本无从下手时,不凡由资深者为这个子系统设计一个外观类来供访问者使用,统一访问路径(集中到外观类中),将繁杂的调用结合起来形成一个总调用写到外观类中,之后访问者不用再繁杂的方法中寻找需要的方法进行调用,直接在外观类中找对应的方法进行调用即可。还有就是在系统与系统之间发生调用时,也可以为被调用子系统设计外观类,这样方便调用也,...原创 2019-01-03 11:59:01 · 468 阅读 · 0 评论 -
Java设计模式(七):适配器设计模式
1. 应用场景在软件开发中,也就是系统的数据和行为都正确,但接口不相符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。比如在需要对早期代码复用一些功能等应用上很有实际价值。适用场景大致包含三类:已经存在的类的接口不符合我们的需求;创建一个可以复用的类,使得该类可以与其他不相关的类或...原创 2019-01-03 11:58:25 · 533 阅读 · 0 评论 -
Java设计模式(六):命令设计模式
1.应用场景有时候需要向某些对象发送请求,但是并不知道请求的接受者是谁,也不知道请求的操作是什么,将‘对象的请求者‘从’命令的执行者’中解耦。使用此模式的优点还在于,command对象拥有更长的生命周期,可以在程序运行的任何时刻去调用这个方法。2. 概念命令设计模式将“请求”封装成对象,以便使用不同的请求队列或者日志来参数化其他对象。命令模式也可以支持撤销的操作。将命令封装成对象中,具有以...原创 2019-01-03 10:26:26 · 451 阅读 · 0 评论 -
Java设计模式(五):单例设计模式
1. 应用场景一个无状态的类使用单例模式节省内存资源。 比如说线程池、缓存、对话框、设置偏好和注册表对象、日志对象、充当打印机、显卡等设备的驱动程序对象。2. 概念确保一个类只有一个实例,并提供该实例的全局访问点。3.Class Diagram使用一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。私有构造函数保证了不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一...原创 2018-12-29 18:49:57 · 435 阅读 · 0 评论 -
Java设计模式(四):工厂设计模式
1. 工厂设计模式1.1 应用场景由于需求的变化,一个类的子类经常面临着剧烈的变化,但他却拥有比较稳定的接口。使用一种封装机制来“隔离这种易变对象的变化”,工厂方法定义一个用于创建对象的接口,让子类来确定创建哪一个具体类的对象,将对象的实例化延迟。1.2 概念定义了一个创建对象的接口,但由子类决定要实例化哪个类。工厂方法把实例化操作推迟到子类。1.3 Class Diagram在简单工...原创 2018-12-25 20:51:59 · 505 阅读 · 0 评论 -
Java设计模式(三):装饰者设计模式
1. 应用场景需要动态的、透明的为一个对象添加职责,即不影响其他对象。需要动态的给一个对象添加功能,这些功能可以再动态的撤销。需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于...原创 2018-12-24 16:41:12 · 505 阅读 · 0 评论 -
Java设计模式(二):观察者设计模式
1. 应用场景某个实例的变化将影响其他多个对象。 观察者模式多用于实现订阅功能的场景,例如微博的订阅,当我们订阅了某个人的微博账号,当这个人发布了新的消息,就会通知我们。2.概念定义对象之间的一对多依赖,当一个对象状态改变时,它的所有依赖都会收到通知并且自动更新状态。主题(Subject)是被观察的对象,而其所有依赖者(Observer)称为观察者。3. Class Diagram主题...原创 2018-12-23 22:36:28 · 422 阅读 · 0 评论 -
Java设计模式(一):策略设计模式
1. 应用场景当系统能在几种算法中快速地切换,或系统中有一些类,它们仅行为不同时,或系统中存在多重条件选择语句时,可以考虑采用策略模式。找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。2. 概念定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算的客户。3. Class DiagramStrategy 接口定义了一个算法族,...原创 2018-12-23 15:29:26 · 444 阅读 · 0 评论