![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
我是小水杯
坚持就是胜利
展开
-
单例模式
1.1 单例模式的特点 单例模式只能有一个实例。 单例类必须创建自己的唯一实例。 单例类必须向其他对象提供这一实例。 1.2 实现 实现步骤 (1) 构造器私有化 (2)由本类创建自身的对象 (3)提供静态方法返回本类对象 1.2.1 懒汉式(线程不安全) public class Singleton { private static Singleton singleton; ...原创 2019-02-28 21:11:09 · 146 阅读 · 0 评论 -
观察者模式
1.定义 指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。 2.场景 2.1 常见场景 火车站实时显示到站信息,微信公众号和该公众号订阅者等 2.2 实现 以微信公众号为例,说明 2.2.1 自定义推模式实现 (1)设计一个主题接口,包含添加,删除,通知的功能 /** *...原创 2019-03-21 23:10:29 · 87 阅读 · 0 评论 -
状态模式
1.定义 对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。 2.场景 家里的吹风机有多个档,每个档级对应的风级不一样,可以用下面的代码进行模拟: public class Blower { public void blow() { String state = "低档"; switch (state...原创 2019-03-29 22:25:54 · 102 阅读 · 0 评论 -
设计模式目录
1.概念 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我...原创 2019-04-03 22:21:57 · 137 阅读 · 0 评论 -
备忘录模式
1.定义 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。 2. 场景 在游戏中碰到BOSS或者临时有事离开前都会选择存档,等到合适的时间可以读档到上次或者前几次保存的位置。 2.1 发起人 控制需要备份的数据,创建和恢复备忘录。它直接和备忘录对象接触,其他对象需要操作备忘录都要经过发起人。 @Data...原创 2019-03-23 11:11:05 · 100 阅读 · 0 评论 -
迭代器模式
1.为什么要使用迭代器模式 通过ArrayList的get方法可以很容易的将集合中的每个元素遍历出来,但是如果要获取hastSet的元素就比较麻烦了,需要掌握链表,数组甚至红黑树的遍历方式,所以为了方便将hastSet的元素遍历出来,jdk提供了一种迭代器的形式,这种设计就是现在要说的迭代器模式。 2.定义 提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。 3.主要角色 ...原创 2019-03-23 20:26:46 · 97 阅读 · 0 评论 -
解释器模式
1.定义 给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。也就是说,用编译语言的方式来分析应用中的实例。这种模式实现了文法表达式处理的接口,该接口解释一个特定的上下文。 2.主要角色 抽象表达式(Abstract Expression)角色:定义解释器的接口,约定解释器的解释操作,主要包含解释方法 interpret()。 终结符表达式(Terminal ...原创 2019-03-26 22:50:50 · 111 阅读 · 0 评论 -
原型模式
1.定义 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。 2.场景 在游戏中,经常会出现带有复制功能的BOSS,为了实现这个复制功能,一般都是先new出该对象然后依次设置其属性到当前状态。虽然功能确实实现了,但是其消耗比较大,尤其是该对象比较"重"的情况下。还好java提供了一种方式可以快速高效复制一个对象,实现方式:实现Cloneable然后重写clone方...原创 2019-03-23 23:21:36 · 95 阅读 · 0 评论 -
命令模式
1.定义 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。 2.主要角色 2.1 Receiver接受者角色 请求的真正执行者 2.2 Command命令角色 声明各种各样的命令,并对应其接受者 2.3 Invoker调用者角色 命令的发起者,通过命令传递到接受者 3.场景 点餐的时候我们只需要...原创 2019-03-24 12:05:32 · 73 阅读 · 0 评论 -
中介者模式
1.定义 定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。 2.场景 玩王者荣耀等游戏时,可以在游戏过程中和其他的玩家对话,系统在特定时间也会发系统消息,一般地做法是每个玩家维护一个当前游戏中的所有玩家列表,但是这样操作就比较复杂并且耦合度比较高,这时可以通过中介者模式将所有玩家的交互有一个中心控制,只要这个中心记录玩家列表,就可以操作所有玩家...原创 2019-03-27 23:30:36 · 95 阅读 · 0 评论 -
桥接模式
1.定义 将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。 2.场景 现在每个人的家里都有好几种电器,比如:电视机,空调等。在选择电器时,会根据喜好和价格挑选对应的品牌。为了将各种品牌的电器创建出来,常见的做法是使用继承的方式,即会产生下面的效果: public abstract class TV { } public class...原创 2019-03-28 07:45:16 · 157 阅读 · 0 评论 -
策略模式
1. 定义 该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。 2. 场景 如果有一个数组,需要根据用户的不同设置修改排序算法,一般会这样实现: 2.1 重构前(伪代码) public class StrategySele...原创 2019-03-04 21:05:11 · 105 阅读 · 0 评论 -
享元模式
1.为什么要使用享元模式 我们可以在租车公司租车,在使用完了之后就需要还给租车公司,并且租的车可能在某一天又让另一个让租,在现实中我们会觉得这是非常正常的,因为如果每个人去租车公司都要取一辆新车的话,世界上就没有租车公司了,它们根本就赔不起。而程序的世界也是一样的,如果存在某些对象可以间隔性地被多次使用就没有必要,每次都new出来,这样会加大内存消费和增加处理时间。那种通过共享已经存在的又橡来大幅...原创 2019-03-03 18:28:06 · 116 阅读 · 0 评论 -
工厂方法模式和抽象工厂模式
1.为什么需要使用工厂模式 工厂模式是使用工厂方法创建对象代替new的方式创建对象,那为什么不直接使用new呢?一般的对象都是直接使用new 类名()创建,最多增加简单的参数。但是有些对象是比较特殊的它需要执行一些复杂的操作才能创建一个完整的对象,比如加载配置文件,参数校验等。每次得到这个对象需要写一大段的代码,不便于代码维护。而且如果有一天需要修改创建该对象的部分逻辑,需要同时在多个地方修改,增...原创 2019-03-23 13:55:07 · 433 阅读 · 0 评论 -
建造者模式
1.为什么要使用建造者模式 假如一个类存在很多个属性,按照原来的方式,需要提供一个很长的构造函数,里面包含所有要使用的属性,代码的可读性极差。出现这样的问题,可以首先想到建造者模式来创建这样的对象。 2.实例 // 主机 public class MainEngine { private String CPU; private String mainBoard; priva...原创 2019-02-28 23:06:12 · 214 阅读 · 0 评论 -
模板方法模式
1. 为什么要使用模板方法模式 一般一件事都可以分为几步执行,并且每次执行只有少数的几步不一样,其他都是不变的。比如:做菜。在做菜之前都会准备刀,作料,开火,开油烟机等,在做完菜之后就会关火和油烟机。这些操作虽然是重复的,但是每次都要操作。我们可以使用下面的伪代码表示 准备刀和作料 开油烟机 开火 --------- 【关键操作】 准备食材 根据不同的食材烹制不同的菜 --------- 【关键操...原创 2019-03-01 09:00:08 · 109 阅读 · 0 评论 -
组合模式
1.定义 是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。 2.场景 2.1 介绍原创 2019-03-05 21:02:47 · 75 阅读 · 0 评论 -
外观模式
1.定义 是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。 2.场景 有这样一个需求:需要将报表用邮件的形式发送到指定的用户,为了简化程序的复杂度,设计发送邮件的流程有:读取邮件配置,设置需要发送的邮件内容,发送邮件。 2.1 重构前 ...原创 2019-03-05 20:43:32 · 106 阅读 · 0 评论 -
责任链模式
1.定义 为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。 2.场景 需求:设计一个请求的网关服务,包括:检查黑名单,校验请求头,请求数据解密,响应数据加密等 if(如果设置了黑名单){ 校验黑名单 } 校验请求头信息 if(数据是否进行加密处理){ 数据解密 } 处理...原创 2019-03-05 21:17:36 · 169 阅读 · 0 评论 -
代理模式
1.为什么要使用代理模式 在爱情公寓中,有这样一个场景:曾小贤的电话编辑会帮他拦截一部分没有“无聊”的来电,如果没有这个电话编辑会怎样呢?曾小贤就要每天处理大量无意义的来电,而且有价值的来电没办法快速处理掉。甚至如果有一天要增加奖励每天价值比较高的来电,那曾小贤根本就忙不过来了。这个场景和代理模式的原理一样的,就是在源对象与目标对象之间起到一个中介或者保护目标对象的作用。 2.实例 模拟一个请求实...原创 2019-03-02 21:46:03 · 202 阅读 · 0 评论 -
适配器模式
1.为什么要使用适配器模式 一般一根数据线只能给一类手机充电,那如果要给另一个类手机充电要怎么办呢?这个时候可能需要一根一拖多的数据线,它可以帮我适配各种手机。而适配器模式的作用和这个是一样的就是用来解决两个接口不兼容的问题。 2.实例 假如已经开发了一个日志系统,其中一个接口是收集日志并发送的日志展示模块,另一个接口就是接受某种日志然后展示到前端。但是由于在前期开发时日志格式已经定义好了,现在有...原创 2019-03-03 11:47:15 · 135 阅读 · 0 评论 -
装饰者模式
1.为什么要使用装饰者模式 月饼是久负盛名的中国传统糕点之一,直至今天月饼的种类已经有各种各样的,比如:五仁月饼,它是将杏仁、桃仁、橄榄仁、芝麻仁和瓜子仁添加到月饼中,让月饼味道更丰富。装饰者模式也是一样,都是扩展的原有的功能,这个可以实现继承的效果并且扩展性更强,所以它可以作为继承的一种替代物。 2.实例 被装饰者的接口 public interface MoonCake { void d...原创 2019-03-03 17:05:57 · 96 阅读 · 0 评论 -
访问者模式
1.定义 将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。 2.场景 现在很多平台都可以给上面的商店打分,通过这种机制可以帮助大家选购出自己满意的商品。现在就有这样一家商店专门卖水果(存在属性:品相)和蔬菜(存在属性:营养价值),同时有两个顾客A和B。A顾客认为水果品相和蔬菜营养价值低...原创 2019-04-03 08:59:00 · 96 阅读 · 0 评论