设计模式
文章平均质量分 89
givmchickenblood
try to like it,do it
展开
-
Guava EventBus 发布/订阅模式
EventBus 是 Guava 的事件处理机制,是观察者模式(生产/消费模型)的一种实现。观察者模式在我们日常开发中使用非常广泛,例如在订单系统中,订单状态或者物流信息的变更会向用户发送APP推送、短信、通知卖家、买家等等;审批系统中,审批单的流程流转会通知发起审批用户、审批的领导等等。转载 2023-01-31 20:54:40 · 253 阅读 · 0 评论 -
构建器builder模式 + lombok @Builder的介绍及使用
参考https://juejin.im/post/68449038626004664391、重叠构造函数的优化对Effective Java书中第二章第二条遇到多个构造器参数时要考虑使用构建器进行复盘。假设某个类,现在有3个必选属性,有5个可选属性.(为了代码简洁,后面都只写一个必选属性,2个可选属性.懂就行).那么现在想提供完善的创建该类的机制,该怎么办呢?1、首先是方法1-使用重叠的构造方法.这是大家都熟悉的方法,重载很多个构造方法,每个的参数都不一样,总有一款适合您!public cl转载 2020-08-27 10:23:35 · 2373 阅读 · 0 评论 -
28 访问者模式
1 定义表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素的前提下定义作用于这些元素的新操作。2 适用场景适用于数据结构相对稳定,又有易于变化的算法的系统(就是element稳定,visitor经常变化)3 优势由于把数据结构和数据结构上的操作进行了解耦,也就是把处理从数据结构中分离出来,使得增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。4 缺点源于...原创 2019-01-18 12:28:52 · 121 阅读 · 0 评论 -
15 抽象工厂模式
1 工厂模式和抽象工厂模式的区别工厂模式适合具体功能类ConcreteProductX只有一个系列的情况;抽象工厂模式适合一个具体功能类ConcreteProductX有至少两个系列的情况。2 抽象工厂模式准确定义提供一个创建一系列相关或相互依赖的接口,而无需指定它们具体的类。3 抽象工厂模式的优点和缺点3.1优点易于交换产品系列,这是最大的优点。例如IFactory factory...原创 2019-01-08 11:41:34 · 133 阅读 · 0 评论 -
16 状态模式
1 定义当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。2 解决的问题状态模式主要用于解决:当控制一个对象状态转换的表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的逻辑简化。3 优势将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。4 使用场景当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为...原创 2019-01-08 15:42:15 · 263 阅读 · 0 评论 -
24 职责链模式
1 定义使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。从定义分析:对于一个请求会有多个对象对其进行转发。请求的发送者和最终处理请求的接受者之间互相并不知道,没有任何耦合关系。最终能够处理一个请求的对象有且只有一个,如果没有则表示处理过程or职责链设置出现错误。2 优势客户提交一个请求...原创 2019-01-14 11:10:05 · 146 阅读 · 0 评论 -
25 中介者模式(调停者模式)
1 定义用一个对象来封装一系列的对象交互。中介者使各对象不需要显示的互相引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。2 优点中介者的出现降低了各个交互对象之间的耦合性,使得可以独立和复用所有的交互对象类、中介者类。由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到了它们之间的交互上来,也就是站在一个更宏观...原创 2019-01-14 11:50:53 · 203 阅读 · 0 评论 -
17 适配器模式
1 定义和作用定义:将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。作用:开发中,系统的数据和行为都正确,但接口不符时,使用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。2 使用场景和优点使用场景:使用一个已经存在的类,但它的接口,也就是它的方法和你的要求不相同时,就应该考虑适配器模式。通常在软件开发的...原创 2019-01-08 17:12:53 · 111 阅读 · 0 评论 -
26 享元模式
1 定义享元模式就是:运用共享技术有效地支持大量细粒度的对象。2 内部状态与外部状态内部状态:在享元对象内部并且不会随环境改变而改变的共享部分。外部状态:随环境改变而改变的、不可以共享的状态。享元模式Flyweight执行时所需的状态有内部的也有外部的,内部状态存储于ConcreteFlyweight对象中,外部状态则应该考虑有客户端对象存储或计算,当调用Flyweight对象的操作...原创 2019-01-14 15:52:43 · 81 阅读 · 0 评论 -
27 解释器模式
1 定义给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。2 适用场景如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这一就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。3 优势可以很容易的扩展和改变文法,因为该模式使用类来表示文法规则,从而可以通过继承来改变和扩展语法。也比较容...原创 2019-01-22 10:23:58 · 94 阅读 · 0 评论 -
18 备忘录模式
1 定义在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。2 适用场景Memento模式适用于功能比较复杂的,需要维护或记录属性历史的类 or 需要保存的属性只是众多属性中的一小部分时,Originator可以根据保存的Memento信息还原到前一状态。有时一些对象的内部信息必须保存在对象外的地方,但是必须由对象自己读取...原创 2019-01-09 10:07:20 · 118 阅读 · 2 评论 -
19 组合模式(Composite Pattern)
1 定义将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的适用具有一致性,即整体和部分可以被一致对待。2 透明方式和安全方式两者各有好处,视情况而定选哪种。透明方式:Compoment抽象类中声明了用来管理子类的方法,包括add(), remove()等,这样继承了该抽象类的类都具有add(), remove()方法。好处:叶节点和枝节点对于外界没...原创 2019-01-09 11:32:11 · 234 阅读 · 0 评论 -
20 迭代器模式
看书:11:35–12:00写博客:12:00–1 定义和使用场景定义:提供一种方法顺序访问一个对象中各个元素,而又不暴露对象的内部表示。使用场景:当需要对聚集有多种方式遍历时,可以用迭代器模式。2 优点迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,带来的优点:不暴露集合的内部结构让外部代码透明地访问集合内部的数据2 实际应用由于现在高级语言,比如j...原创 2019-01-09 15:05:34 · 132 阅读 · 0 评论 -
手动实现AOP:动态代理+反射
前面在学习代理模式的时候,了解到代理模式分为动态代理和静态代理。现在我们就以代理模式为基础先实现我们自己的AOP框架,再来研究Spring的AOP的实现原理。1 静态代理先以静态代理实现,静态代理关键是在代理对象和目标对象实现共同的接口,并且代理对象持有目标对象的引用。公共接口代码:public interface IHello { /** * 业务方法 * @...原创 2019-01-22 17:07:30 · 1212 阅读 · 0 评论 -
简单工厂、工厂、抽象工厂的对比
本文只讲解3中模式的对比,不讲解详情简单工厂模式简单工厂模式的讲解核心方法:工厂类的CreateOperation(String),让其通过多态,创造相应实例。优点: 增加各种复杂的运算时,工厂类可以封装变化,让客户端更加方便的实现运算功能。缺点:违背开放-封闭原则。使用场景:比如实现运算功能的时候,需求可能会很多,很容易变化。假如新增某个需求,那么使用工厂模式,只需要新增继承Oper...原创 2019-03-12 17:17:32 · 214 阅读 · 0 评论 -
开放-封闭原则
对扩展开放,对修改关闭。无论模块是多么的“封闭”,都会存在一些无法对之封闭的变化。等到变化发生时立即采取行动,创建抽象来隔离以后发生的同类变化。比如,实现加法功能,在cilent类中完成的话,以后再加减法操作的时候,就需要修改client类了,就违背了“开闭原则”,这时就需要重构代码,增加一个抽象的运算类,通过继承、多态等来隔离具体的加法、减法与client耦合,需求依然满足,还能应对变化(乘除...原创 2019-03-18 18:59:25 · 102 阅读 · 0 评论 -
14 观察者模式
参考https://blog.csdn.net/caoxiaohong1005/article/details/790197061 准确定义定义了一种一对多的依赖关系,让多个观察者对象同事监听某一个主题的对象。这个主题对象在状态在发生变化时,会通知所有的观察者对象,让它们能够自动更新自己。2 使用的意义讲一个系统分割成一系列相互协作的类有一个不好的副作用,那就是需要维护相关对象的一致性。...转载 2019-01-06 16:02:34 · 125 阅读 · 0 评论 -
13 建造者模式
1 准确定义将一个复杂对象的创建和表示分离,使得同样的创建过程可以得到不同的表示。2 适用场景用于创建一些复杂的对象,这些对象内部构建间的顺序通常是稳定的,但对象内部的构建通常面临着复杂的变化。3 优势使得建造代码和表示代码分离。由于建造者隐藏了产品是如何组装的,因此如果需要改变一个产品的内部表示时,只需要再添加一个ConcreteBuilder即可。4 注意建造者模式中一个很重要...原创 2019-01-06 10:57:27 · 107 阅读 · 0 评论 -
12 外观模式
参考https://blog.csdn.net/caoxiaohong1005/article/details/789976781 定义:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这个子系统更加容易使用。2 优势完美体现了依赖倒转原则和迪米特法则。3适用场景在软件设计初期阶段,应有意识的将不同的两个层分离,然后在两个层之间建立一个Facade。...原创 2019-01-05 22:05:26 · 167 阅读 · 0 评论 -
Java 增强一个类的几种方法
转自 https://blog.csdn.net/friday_pj/article/details/72983737 今天有人问我怎么增强一个类的功能。博客刚好没东西,今天就讲讲增强类。增强的手段有三种类型: 1、继承或者实现接口:特点是被增强对象不能变,增强的内容不能变。 2、装饰着模式:特点是被增强对象可变,但增强内容不可变。 3、动态代理:特点是被增强对象可变,增强内容可变。...转载 2018-08-22 22:00:30 · 1357 阅读 · 0 评论 -
java 装饰者模式
转自 https://www.cnblogs.com/chenxing818/p/4705919.html转载 2018-08-22 22:14:03 · 110 阅读 · 0 评论 -
简单工厂模式
什么是简单工厂模式简单工厂模式:比如要实现一个做运算的功能(加减乘除)父类:Operation子类:OperationAdd、OperationSub、OperationMul、OperationDiv简单工厂类的核心方法是:Operation CreateOperation(String),让其通过多态,创造相应实例。优点: 增加各种复杂的运算时,工厂类可以封装变化,让客户端更加方便的...原创 2018-12-12 23:25:47 · 238 阅读 · 0 评论 -
策略模式
什么是策略模式策略模式:它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。简单工厂类的核心方法是:Operation CreateOperation(String),让其通过多态,创造相应实例。优点: 增加各种复杂的运算时,工厂类可以封装变化,让客户端更加方便的实现运算功能。类图:实例Operation类public class ...原创 2018-12-12 23:34:18 · 137 阅读 · 0 评论 -
装饰者模式
装饰模式定义:动态的地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。类图:Component定义一个对象接口,可以为这些对象动态地添加职责。ConcreteComponent定义了一个具体的对象,也可以给这个对象添加一些职责。Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道D...原创 2018-12-13 10:16:58 · 96 阅读 · 0 评论 -
静态代理模式
什么是代理模式代理模式就是为其他对象(真实对象,卓嫁衣)提供一种代理(戴励)以控制对这个对象的访问。原创 2018-12-13 16:39:38 · 122 阅读 · 0 评论 -
工厂方法模式
什么是工厂方法模式工厂方法模式:定义一个用于创建对象的接口(IFactory),让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。简单工厂模式中的工厂类与分支耦合,那么根据依赖倒置原则,我们把工厂类抽象出一个接口,这个接口只有一个方法,就是创建抽象产品的工厂方法。然后,所有要生产具体类的工厂,就去实现这个接口,这样一个劲简单工厂模式的工厂类,变成了一个工厂抽象接口和多个具体生产对...原创 2018-12-13 18:40:40 · 150 阅读 · 0 评论 -
原型模式 浅拷贝与深拷贝
什么是原型模式原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式就是从一个对象在创建另外一个可定制的对象,而不需要知道任何创建细节。clone()方法的作用:创建当前对象的浅拷贝。方式是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段字段逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象,因此,原始对象及其副本引...原创 2018-12-14 12:16:23 · 241 阅读 · 0 评论 -
动态代理机制详解
参考 https://www.cnblogs.com/xiaoluo501395377/p/3383130.html 在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习的是其底层是怎么样的一个原理,而AOP的原理就是ja...原创 2018-06-27 09:44:45 · 157 阅读 · 0 评论 -
21 单例模式
1 定义单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。2 UML# 3 优点严格控制客户端如何访问和何时访问它,即对唯一实例的受控访问。4 单例类和实用类的区别相同:实用类也采用私有的构造方法避免其实例化。不同:实用类不保存状态,仅提供静态方法或者静态属性给用户使用;而单例类是有状态的。实用类不能用于继承多态;单例类可以有子类继承。实用类只是一些方法和属............原创 2019-01-10 18:42:21 · 282 阅读 · 0 评论 -
22 桥接模式
1 定义将抽象部分和它的实现部分分离,使它们都可以独立的变化。也就是说:实现系统可能会有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让他们独立变化,减少它们之间的耦合。2 组合/聚合复用原则2.1 组合和聚合的定义组合(合成):强拥有关系,比如大雁和翅膀的关系,大雁拥有2只翅膀,翅膀是大雁的一部分,2者的声明周期是一样的。聚合:弱拥有关系,比如雁群和大雁的关系,雁群由...原创 2019-01-10 20:53:33 · 198 阅读 · 0 评论 -
23 命令模式
1 定义将一个请求封装为一个对象,从而可以使用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销操作。2 优势能较容易的设计一个命令队列。在需要的情况下,可以较容易的将命令记入日志。允许接受请求的一方决定是否要否决请求。可以容易的实现对请求的撤销和重做。由于加进具体命令类不影响其他的类,因此增加新的具体命令操作很容易。最重要一点就是:命令模式把请求一个操作的对象...原创 2019-01-10 22:32:39 · 166 阅读 · 0 评论 -
10 模板方法模式
1 定义定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。重定义操作通过覆写模版方法里面的抽象方法而实现。2 实质通过把不变行为迁移到超类,去除子类中的重复代码。3 优势模版方法模式提供了一个很好的代码复用平台。4 应用场景当我们要完成在某一细节层次一致的一个过程或一系列的步骤,但个别步骤在更详细的层次上的实...原创 2019-01-05 21:23:04 · 152 阅读 · 0 评论 -
11 迪米特法则
定义如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果一个类要调另一个类的某个方法的话,可以通过第三者转发这个调用。思想在类的结构设计上,每个类应尽量降低成员的访问权限,强调了类之间的松耦合。类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。...原创 2019-01-05 21:39:53 · 81 阅读 · 0 评论 -
Java中增强for循环的实现原理和坑详解(内附 迭代器模式)
转自 https://www.jb51.net/article/138234.htm前言引入增强for循环的原因:在JDK5以前的版本中,遍历数组或集合中的元素,需要先获得数组的长度或集合的迭代器,比较麻烦。JDK5中定义了一种新的语法—-增强for循环,以简化此类操作。增强for循环只能用在数组或实现Iterable接口的集合上。语法格式: for(变量类型 变...转载 2018-08-22 21:53:24 · 1828 阅读 · 0 评论