设计模式
文章平均质量分 69
设计模式
码上得天下
这个作者很懒,什么都没留下…
展开
-
设计模式——解释器模式
解释器模式,就是定义语言的文法,并建立一个解释器来解释该语言中的句子,通过构建解释器,解决某一频繁发生的特定类型问题实例。这里我们将语言理解成使用规定格式和语法的代码解释器模式描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发的编译器中,它描述了如何为简单的语言定义一个文法,如何在该语言中表示一个句子,以及如何解释这些句子。例如我们经常利用正则表达式检测某些字符串是否符合我们规定的格式。转载 2023-06-21 13:02:57 · 501 阅读 · 0 评论 -
设计模式——中介者模式
在我们的生活中处处充斥着“中介者”,比如你租房、买房、找工作、旅游等等可能都需要那些中介者的帮助,地球上国与国之间的关系异常复杂,会因为各种各样的利益关系来结成盟友或者敌人,国与国之间的关系同样会随着时间、环境因为利益而发生改变,而地球上最大的中介者就是联合国了,它主要用来维护国际和平与安全、解决国际间经济、社会、文化和人道主义性质的问题。转载 2023-06-21 12:54:51 · 60 阅读 · 0 评论 -
设计模式——状态模式
状态模式,就是允许对象在内部状态发生改变时改变它的行为,对象看起来就好像修改了它的类,也就是说以状态为原子来改变它的行为,而不是通过行为来改变状态。当对象的行为取决于它的属性时,我们称这些属性为状态,那该对象就称为状态对象。对于状态对象而言,它的行为依赖于它的状态,比如要预订房间,只有当该房间空闲时才能预订,想入住该房间也只有当你预订了该房间或者该房间为空闲时。对于这样的一个对象,当它的外部事件产生互动的时候,其内部状态就会发生变化,从而使得他的行为也随之发生变化。转载 2023-06-21 12:47:14 · 246 阅读 · 0 评论 -
设计模式——备忘录模式
备忘录模式提供了一种恢复状态的机制,在不破坏封装的前提下,捕获对象的内部状态,并保存在该对象之外,保证该对象能够恢复到某个历史状态;备忘录模式将保存的细节封装在备忘录中,除了创建它的创建者之外其他对象都不能访问它,并且实现了即使要改变保存的细节也不影响客户端。但是备忘录模式都是多状态和多备份的,会早用较多的内存,消耗资源。转载 2023-06-21 12:36:21 · 157 阅读 · 0 评论 -
设计模式——访问者模式
将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进行分离,是行为类模式中最复杂的一种模式。定义一个访问具体元素的接口,为每个具体元素类对应一个访问操作 visit() ,该操作中的参数类型标识了被访问的具体元素。实现抽象访问者角色中声明的各个访问操作,确定访问者访问一个元素时该做什么。转载 2023-06-21 12:18:12 · 59 阅读 · 0 评论 -
设计模式——外观模式
*** 定义一个购物处理过程*///挑选商品//添加购物车//选择快递方式//支付void pay();/*** 购物过程的实现类*/@OverrideSystem.out.println("挑选商品:"+goodName);@OverrideSystem.out.println("将商品"+goodName+"添加购物车!");@OverrideSystem.out.println("选择快递方式"+delivName);@Override。转载 2023-06-20 22:46:22 · 82 阅读 · 0 评论 -
设计模式——组合模式
一棵树形机构中的所有节点都是Component,局部和整体对调用者来说没有任何区别,也就是说,高层模块不必关心自己处理的是单个对象还是整个组合结构,简化了高层模块的代码。使用了组合模式后,我们可以看看,如果想增加一个树枝节点、树叶节点是不是都很容易,只要找到它的父节点就成,非常容易扩展,符合开闭原则,对以后的维护非常有利。只要是树形结构,就要考虑使用组合模式,这个一定要记住,只要是要体现局部和整体的关系的时候,而且这种关系还可能比较深,考虑一下组合模式吧。● 从一个整体中能够独立出部分模块或功能的场景。转载 2023-06-20 22:30:09 · 54 阅读 · 0 评论 -
设计模式——装饰者模式
的核心思想是通过创建一个装饰对象(即装饰者),动态扩展目标对象的功能,并且不会改变目标对象的结构,提供了一种比继承更灵活的替代方案。需要注意的是,装饰对象要与目标对象实现相同的接口,或继承相同的抽象类;另外装饰对象需要持有目标对象的引用作为成员变量,而具体的赋能任务往往通过带参构造方法来完成。转载 2023-06-20 22:03:51 · 207 阅读 · 0 评论 -
设计模式——桥接模式
1.桥接模式(Bridge模式)是指:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变。2.是一种结构型设计模式3.Bridge模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及他们的功能扩展原理类图:(1)Abstraction:抽象类。(2)RefinedAbstraction:扩充抽象类。转载 2023-06-20 21:08:16 · 117 阅读 · 0 评论 -
设计模式的六大原则
其中,我们称出现成员变量、方法参数、方法返回值中的类为直接的朋友,而出现在局部变量中的类则不是直接的朋友。也就是说,对于被依赖的类来说,无论逻辑多么复杂,都尽量地的将逻辑封装在类的内部,对外除了提供的public方法,不对外泄漏任何信息。2、开闭原则,可以通过“抽象约束、封装变化”来实现(对扩展开放(提供方),对修改关闭(使用方),遵循其他规则最终就是遵循开闭原则,所以开闭是最重要的一个原则);比如接口A有5个方法,类B使用到A的两个方法,那么A就应该拆分两个接口,其中一个接口只提供B需要的方法即可);原创 2023-06-20 17:00:22 · 1203 阅读 · 0 评论 -
设计模式——监听器模式(二)ApplicationContext
/** * 事件 */@AllArgsConstructor@NoArgsConstructor@Datapublic class Event { /** * 事件类型 */ private int eventType; /** * 消息体 */ private JSONObject msgJson;}package org.demo.spring.event;import com.alibaba.fa.原创 2021-10-13 19:04:39 · 402 阅读 · 0 评论 -
设计模式——观察者模式(三)Google Guava EventBus
Google Guava 事件总线传统上,Java的进程内事件分发都是通过发布者和订阅者之间的显式注册实现的。设计EventBus就是为了取代这种显示注册方式,使组件间有了更好的解耦。EventBus不是通用型的发布-订阅实现,不适用于进程间通信。EventBus是Guava的事件处理机制,是设计模式中的观察者模式(生产/消费者编程模型)的优雅实现。对于事件监听和发布订阅模式,EventBus非常优雅使用起来也非常的简单,这个可不是吹的是真的非常的简单。依赖 <d..原创 2021-10-14 10:29:18 · 382 阅读 · 0 评论 -
设计模式——模板方法(二)
假设某个业务场景,调用不同的API入参大部分相同,小部分不同。/** * 回调接口 */public interface CallBackDemo { public void toCallBack(User user);}/** * 公共入参 */@Datapublic class User implements Serializable { private static final long serialVersionUID = 1L;原创 2021-10-13 17:50:37 · 293 阅读 · 0 评论 -
设计模式——观察者模式(一)
在现实世界中,许多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如,某种商品的物价上涨时会导致部分商家高兴,而消费者伤心;还有,当我们开车到交叉路口时,遇到红灯会停,遇到绿灯会行。这样的例子还有很多,例如,股票价格与股民、微信公众号与微信用户、气象局的天气预报与听众、小偷与警察等。在软件世界也是这样,例如,Excel 中的数据与折线图、饼状图、柱状图之间的关系;MVC 模式中的模型与视图的关系;事件模型中的事件源与事件处理者。所有这些,如果用观察者模式来转载 2021-09-27 19:02:48 · 1489 阅读 · 0 评论 -
设计模式——观察者模式(二)
package org.example.design.notifier;import org.demo.schedule.SpringContextUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.core.task.TaskExecutor;import java.util.ArrayList;import java.util.List;import java..原创 2021-09-27 19:03:34 · 91 阅读 · 0 评论 -
设计模式——责任链模式(三)
责任链模式的源码体现,SpringMVC的异常处理 HandlerExceptionResolver,resolveException方法就是很明显的责任链模式。public class HandlerExceptionResolverComposite implements HandlerExceptionResolver, Ordered { @Nullable private List<HandlerExceptionResolver> resolvers;原创 2021-09-09 16:37:26 · 139 阅读 · 0 评论 -
设计模式——命令模式
在软件开发系统中,“方法的请求者”与“方法的实现者”之间经常存在紧密的耦合关系,这不利于软件功能的扩展与维护。例如,想对方法进行“撤销、重做、记录”等处理都很不方便,因此“如何将方法的请求者与实现者解耦?”变得很重要,命令模式就能很好地解决这个问题。在现实生活中,命令模式的例子也很多。比如看电视时,我们只需要轻轻一按遥控器就能完成频道的切换,这就是命令模式,将换台请求和换台处理完全解耦了。电视机遥控器(命令发送者)通过按钮(具体命令)来遥控电视机(命令接收者)。再比如,我们去餐厅吃饭,菜单不是等到客人来转载 2021-08-27 10:14:04 · 451 阅读 · 0 评论 -
设计模式——管道模式(并发模式)
1、pipeline简介pipeline又称为管道,是一种在计算机普遍使用的技术。举个最普遍的例子,如下图所示cpu流水线,一个流水线分为4部分,每个部分可以独立工作,于是可以处理多个数据流。linux 管道也是一个常用的管道技术,其字符处理功能十分强大,在面试过程中常会被问到。在分布式处理领域,由于管道模式是数据驱动,而目前流行的Spark分布式处理平台也是数据驱动的,两者非常合拍,于是在spark的新的api里面pipeline模式得到了广泛的应用。还有java web中的struct的filter转载 2021-08-25 10:26:52 · 1879 阅读 · 2 评论 -
设计模式——管道模式(二)
管道配置:package org.example.design.pipeline;import lombok.extern.slf4j.Slf4j;import java.util.ArrayList;import java.util.List;/** * Description: 供应商调用管道 * */@Slf4jpublic class Pipeline<S> { private List<Step<S>> steps = n原创 2021-08-24 19:39:24 · 346 阅读 · 0 评论 -
设计模式——管道模式(一)
管道模式(Pipeline Pattern) 是 责任链模式(Chain of Responsibility Pattern)的常用变体之一。在管道模式中,管道扮演着流水线的角色,将数据传递到一个加工处理序列中,数据在每个步骤中被加工处理后,传递到下一个步骤进行加工处理,直到全部步骤处理完毕。PS:纯的责任链模式在链上只会有一个处理器用于处理数据,而管道模式上多个处理器都会处理数据。何时使用管道模式任务代码较为复杂,需要拆分为多个子步骤时,尤其是后续可能在任意位置添加新的子步骤、删除旧的子步转载 2021-08-24 17:44:52 · 4460 阅读 · 0 评论 -
设计模式——责任链模式(二)
package org.example.design.chain.custom;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class HandlerBaseChain<Q, R> { private static final Logger log = LoggerFactory.getLogger(HandlerBaseChain.class); private HandlerBaseC.原创 2021-08-24 14:38:29 · 174 阅读 · 0 评论 -
设计模式——责任链模式(一)
简介Commons-chain是apache commons中的一个子项目,主要被使用在"责任链"的场景中,struts中action的调用过程,就是使用了"chain"框架做支撑.如果你的项目中,也有基于此种场景的需求,可以考虑使用它. 所谓"责任链"就是一系列有序的command能够按照顺序执行,并能够互相交换或者传递执行结果,和我们常说的"责任链"模式类似.先从一个例子开始汽车销售流程:试车 -> 销售谈判 -> 安排财务 -> 结束销售 假设使用传统的模板模式pu转载 2021-08-24 11:17:56 · 618 阅读 · 1 评论 -
设计模式——监听器模式
import lombok.extern.slf4j.Slf4j;import javax.annotation.Resource;@Slf4jpublic class BaseProcess { // 具体方法根据业务逻辑而定 @Resource private BusinessService businessService; protected void process(MultiMsg multiMsg) { businessServic.原创 2021-08-23 19:40:44 · 625 阅读 · 0 评论 -
设计模式——生产者消费者模式
@SuppressWarnings({ "rawtypes", "unchecked" })@ManagedResource(objectName = QueuesHolder.QUEUEHOLDER_MBEAN_NAME, description = "Queues Holder Bean")public class QueuesHolder { /** * QueueManager...原创 2021-05-18 08:59:09 · 102 阅读 · 0 评论 -
设计模式——观察者模式
什么是观察者模式?观察者模式(Observer Pattern)定义了对象间的一种一对多的依赖关系,这样只要一个对象的状态发生改变,其依赖的所有相关对象都会得到通知并自动更新。在观察者模式中,发生改变的对象叫做观察目标,而被通知更新的对象称为观察者,一个观察目标对应多个观察者,观察者一般是一个列表集合,可以根据需要动态增加和删除,易于扩展。使用观察者模式的优点在于观察目标和观察者之间是抽象松耦合关系,降低了两者之间的耦合关系。发布-订阅模式观察者模式很多地方也叫发布-订阅模式(Pu.转载 2021-05-05 15:09:39 · 275 阅读 · 0 评论 -
设计模式——享元模式
单例模式是类级别的,一个类只能有一个对象实例;享元模式是对象级别的,可以有多个对象实例,多个变量引用同一个对象实例;享元模式主要是为了节约内存空间,提高系统性能,而单例模式主要为了可以共享数据;使用场景:自定义线程池或者某些由固定参数(不同值)生成的DTO;以下是自定义线程池,核心参数配置在数据库;工厂方法类维护一个对象存储池。public class WorkExecutorRepository { /** * final修饰引用类型成员变量表示引用地址不可变,其内容可以改.原创 2021-04-29 16:31:21 · 531 阅读 · 0 评论 -
设计模式——模板方法
它定义一个操作中的算法的框架,而将一些步骤延迟到了子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些步骤。简单点来说,就是,在父类定义一个抽象方法,然后不同的子类实现不同的业务逻辑。// 公共接口public interface DoService { void doSomething();}// 公共接口实现类,模板方法定义在其中public abstract class DoServiceImpl implements DoService { @Ove.原创 2020-08-14 20:06:38 · 225 阅读 · 0 评论 -
设计模式——建造者模式
建造者模式: 建造者模式,又称构建者模式,将一部负责对象的构建分为许多小对象的构建,最后在整合构建的模式。 构建者模式一般用在构建流程或者组成部件固定的场合,将这些部件分开构建成为组件对象,再将这些组件对象整合成为目标对象。建造者模式相关源码,guaua的CacheBuilder,获取一个LoadingCache实例,代码如下 LoadingCache<String, Map<String, V>> loadingCache = CacheBu...原创 2020-08-14 20:51:59 · 187 阅读 · 0 评论