![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
文章平均质量分 70
伟衙内
这个作者很懒,什么都没留下…
展开
-
原版设计模式之解释器模式(Interpreter)
Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the language.(给定一种语言,为其语法定义一个表示,以及一个使用该表示来解释该语言中的句子的解释器。)For example, searching for strings that match a pattern is a翻译 2022-06-17 16:06:54 · 199 阅读 · 0 评论 -
原版设计模式之命令模式
Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations.(将请求封装为一个对象,允许你使用不同的请求、队列或日志请求来作为客户端的参数,并支持不可执行的操作。)Action, TransactionThe Command pattern lets too翻译 2022-06-17 10:51:11 · 145 阅读 · 0 评论 -
原版设计模式之责任链模式
Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.(为了避免将发送者和接收者耦合,给每个接收者都有一次处理请求的机会。将接收者串成链,并沿着链翻译 2022-06-10 17:31:36 · 109 阅读 · 0 评论 -
原版设计模式之代理模式
Intent (定义)Provide a surrogate or placeholder for another object to control access to it.(为另一个对象提供代理或占位符,以控制对它的访问。)Also Known As (别名)SurrogateMotivation (详细说明)图像编辑器为例,图像编辑器有很多不同的图像,在需要时使用。在打开图像编辑器时,如果一次性创建很多图像,则响应过慢。The solution is to use another ob翻译 2022-06-10 10:51:09 · 246 阅读 · 0 评论 -
原版设计模式之享元模式(Flyweight)
Intent (定义)Use sharing to support large numbers of fine-grained objects efficiently(使用共享可以有效地支持大量的细粒度对象。)Motivation (详细说明)如下图所示,这是一个文档编辑器,有字符对象,列对象和行对象。每次在文档中书写单词时,都需要一个字符对象和列对象,换行则需要一个行对象。当文档内容比较多时,则需要大量的内存来保存对象。A flyweight is a shared object that翻译 2022-05-24 15:36:45 · 79 阅读 · 0 评论 -
原版设计模式之外观模式(Facade)
Intent (定义)Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.(将子系统的一系列接口统一为一个接口。外观模式为了使子系统更易用,而定义了更高层次的接口)Motivation (更多释义)Structuring a system into subsyste翻译 2022-05-24 10:47:11 · 109 阅读 · 0 评论 -
原版设计模式之装饰器(Decorator)
Intent (定义)Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality(动态的赋予对象额外的职责。装饰者们扩展对象的功能,而不需要将对象子类化。)Also Known As (别名)WrapperMotivation (更多释义)以图形绘画工具为例。有时,希翻译 2022-05-20 14:26:26 · 161 阅读 · 0 评论 -
原版设计模式之组合模式(Composite)
Intent (定义)Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.(将对象组合成树形结构,以表示整体和部分的层次。组合模式能让客户端无差别的对待独立的个体和组合的对象)Motivation (详情)如在绘图编辑器中,让用户用简单翻译 2022-05-19 15:56:53 · 147 阅读 · 0 评论 -
原版设计模式之桥接模式
Intent (定义)Decouple an abstraction from its implementation so that the two can vary independently. (从实现中分离出抽象,使两者可以独立变化)Also Known As (别名)Handle/BodyMotivation (详细解释)如上图,如果要让程序在X系统和IBM的演示系统(PM)上都顺利运行的话,那么需要定义XWindow和PMWindow两个窗口展示。假设出现一个图标窗口(IconWin翻译 2022-05-19 11:45:06 · 91 阅读 · 0 评论 -
原版设计模式之适配器模式
Intent (定义)Convert the interface of a class into another interface clients expect. (将一个接口转换为客户端希望的另一个接口)Adapter lets classes work together that couldn’t otherwise because of incompatible interfaces.(适配者能让无法用其他方式协同工作的不兼容接口协同工作)Also Known As (别名)Wrapper (翻译 2022-05-13 11:21:14 · 102 阅读 · 0 评论 -
设计模式之反观察者模式
观察者模式有上面这个案例,也是我最近听到的一个案例,新浪天气和百度天气都是观察者,气象局如果有数据改变,那么调用notifyObserver通知其他观察者,然后其他观察者就可以进行改变。疑问这是一个很理想的状态,但是真实情况是,SinaWeather和BaiduWeather每隔一段时间去监听WeatherData的数据,用新数据不断更新自己的老数据。也就是说,并不是由被观察者来通知观察者行为改变,而是被观察者行为改变后,观察者通过比对得到结论。反观察者如上图所示,被不是等待被观察对象Wea原创 2022-05-12 20:32:34 · 199 阅读 · 0 评论 -
原版设计模式之单例模式
Intent (定义)Ensure a class only has one instance, and provide a global point of access to it.(确保一个类只有一个实例,并提供全局访问的通道)Motivation (案例)How do we ensure that a class has only one instance and that the instance is easily accessible?(如何确保一个类只有一个实例,并且是易于访问的?)A翻译 2022-05-12 14:54:15 · 77 阅读 · 0 评论 -
原版设计模式之原型模式
Intent (定义)Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype.(指定使用原型实例创建的对象类型,并通过拷贝此实例创建一个新对象)Motivation (举例)上述音谱编辑器,创建音谱为例,需要使用图形工具创建不同的音符图形,并绘制在不同的位置。首先就是GraphicTool并不知道需要绘制哪种音符,如果翻译 2022-05-11 15:43:05 · 112 阅读 · 0 评论 -
原版设计模式之工厂方法
Intent (定义)Define an interface for creating an object(定义一个接口去创建对象), but let subclasses decide which class to instantiate.(但是由子类决定哪个类将被实例化) Factory Method lets a class defer instantiation to subclasses.(工厂方法让类的实例化推迟到子类中)Also Known As (别名)Virtual Construc翻译 2022-05-06 15:30:41 · 85 阅读 · 0 评论 -
原版设计模式之建造者模式
Intent (定义)Separate the construction of a complex object from its representation,so that the same construction process can create different representations. (将复杂对象的构建从他的展示中分离,以便,相同的构造过程能创建不同的展示。)Motivation (举例)以RTF文本文档能转变为各种其他类型的文档为例。RTFReader: 指挥者,用翻译 2022-05-06 11:36:10 · 94 阅读 · 0 评论 -
原版设计模式之抽象工厂模式
Intent (定义)Provide an interface for creating families of related or dependent objects withoutspecifying their concrete classes.(提供一个接口去创建相关联或者依赖的对象,而不用指定具体的实现类)Also Known As (又名)KitMotivation (举例)(以下是自己理解,其实英文版解释的更好)上述是用一个软件设计的案例来的,WidgetFa翻译 2022-05-01 18:19:19 · 79 阅读 · 0 评论 -
原版设计模式前言
design patterns elements of reusable object-oriented softwar_Java知识分享网-免费Java资源下载整理了一下自己目前所理解的设计模式,然后再去看以前的视频温顾了下设计模式。但是我发现,无论是以前看的视频,还是目前新找的设计模式视频,基本都是大同小异,都是拿什么咖啡,鸭子之类的举例,难道所有人都想到一块去了???于是乎,从网上找了当初23中设计模式的英文版看了一下,获益匪浅,好像也并没有那么多乱七八糟的演变,而且它里面纯粹转载 2022-05-01 16:44:04 · 63 阅读 · 0 评论 -
设计模式(概览)
创建型模式顾名思义,用来创建对象使用。工厂模式,建造者模式,单例模式结构型模式用来改变类的结构,包一层或者组合一些东西进去。适配器模式,装饰器模式,代理模式,桥接模式,外观模式,组合模式,享元模式。行为型模式用于描述某些类之间的职责划分和相互协作关系。策略模式、模板模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。三层模式目前开发都是Controller,Service,ServiceImpl,Dao三层模式。如上图所示,S原创 2022-04-06 09:50:34 · 208 阅读 · 0 评论 -
设计模式之解释器模式
定义: 提供对语言的语法定义,并说明此语法的作用。比如SQL语句,mysql怎么知道where就是条件查询呢? insert into 就是插入数据呢?这就是先定义了select,where这些关键词的语义,然后规定语法,在用户正确书写后可以对SQL语句进行拆分和转换其中关键词的含义。此模式我基本没用过,所以对于复杂应用场景也不是太熟悉。...原创 2022-04-05 07:43:51 · 573 阅读 · 0 评论 -
设计模式之中介者模式
顾名思义,买房和卖房的人一般会委托中介,而不是直接去找卖主,卖主也不会接触买主。那么在设计模式中这个中介对象,就是简化原有对象之间的交互关系,降低对象间的耦合度,使原有对象之间不必相互了解。如果像上面这样,对象与对象之间的交互形成了网状结构,各自相互依赖。关系很是复杂,有时候都不知道调用哪。引入一个中介,就变成如下方式,所有对话都是通过中介,买主和中介是一对一,中介和其他对象一对多。先提取中介的关键词: 中介对象,其他对象(多个)假设有一个短信服务,需要判断是否额外要发邮件。邮箱服务发送邮件原创 2022-04-05 07:42:29 · 146 阅读 · 0 评论 -
设计模式之访问者模式
这应该算是比较难理解的一个模式了。这种模式一般针对于被访问者类是固定,而访问者是经常变化的场景。目前此类暂不做过多描述,我自己也没完全掌握,每次写完代码后可以看一遍访问者模式,看看是否可以改成访问者模式。被访问者/** * @author lw * @date 2022/4/1 0001 * @description 被访问者 */public interface BeiVisit { void show(Visit visit); String getContent原创 2022-04-05 07:35:27 · 113 阅读 · 0 评论 -
设计模式之状态模式
定义: 当对象的状态改变,其行为也会改变。一般理解为,一个对象在不同的状态会有不同的方法调用。比如在短信发送中,短信分为未发送,发送成功,发送失败等三个状态。每一个状态的改变都需要有对应的动作处理。/** * @author lw * @date 2022/3/29 0029 * @description 短信服务 */public class SmsService { public void send(String content) { System.out.p原创 2022-04-05 07:30:16 · 110 阅读 · 0 评论 -
设计模式之备忘录模式
定义是: 不破坏对象封装性,保存对象的内部状态。它有个别名: 备份和恢复模式如下所示,有个变量a,但是a的内容错了,现在要把a的内容换一下。String a="a";//····一系列操作后····a=1234567//此时a的原来数据就丢失了。String temp = a;//如果在改变a数据前,将它给另一个对象先保存下。//此时a能从temp恢复原来的内容。a = temp;把这些变成自己写的对象的话,那么就需要一个额外的temp对象,用于保存A这个对象的内部数据。这里就不使用原创 2022-04-05 07:22:49 · 159 阅读 · 0 评论 -
设计模式之命令模式
定义: 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。先转换概念: 将一个命令封装为一个对象,使发出命令的对象和执行命令的对象分割开。提取关键词: 命令=对象,发出命令的对象,执行命令的对象。需要3个对象。如上所示,定义了三个对象,扩展了两个具体命令。命令发送方/** * @author lw * @date 2022/3/31 0031 * @description 短信调用者(发出命令方 */public class SmsInvoker { //一系原创 2022-04-05 07:19:06 · 183 阅读 · 0 评论 -
设计模式之责任链模式
顾名思义,这是一个链式传递,将责任一层一层传递,最终找到背锅的那位。提取关键词: 链式传递,最终者。那么必然前面一位要知道怎么把这个锅传给后面一位,要是都不知道后面一位是谁,怎么传递责任。如同上图一样,假如一个系统出问题了,总监问主任,主任找部长,部长找组长,组长最终让程序员找原因,这样层层传递。找到原因后也可以一层层将原因汇报上去。假如部长有天挂了,主任一直不问世事,压根不知道组长是谁,那么他这个责任就传递不下去了。还是以短信举例,在发短信前肯定有一大堆过滤器,黑名单校验的,内容校验的。原创 2022-04-05 07:12:35 · 152 阅读 · 0 评论 -
设计模式之迭代器模式
此模式看下图就知道了,用来遍历访问ArrayList中数据对象,而不会暴露内部逻辑。在ArrayList中有一个迭代器,Itr,用来访问ArrayList中的数据。一般调用方式如下,List<String> list = new ArrayList<>();Iterator<String> iterator = list.iterator();while(iterator.hasNext()){ System.out.println(iterator.原创 2022-04-05 07:08:38 · 109 阅读 · 0 评论 -
设计模式之观察者模式
定义: 多个对象间存在一对多关系,当一个对象发生改变时,会把这种改变通知给其他多个对象,从而影响其他对象的行为。首先提取关键词,多个对象、一对多关系,通知其他对象。根据上述关键词定义一个多的对象(SmsTarget),定义一个改变的量(SmsPool.smsContent),再定义通知方法notifyObserver()。/** * @author lw * @date 2022/3/31 0031 * @description 短信池 */public class SmsPool {原创 2022-04-05 07:03:59 · 152 阅读 · 0 评论 -
设计模式之模板模式
顾名思义,定义一个模板,使用模板的子类可以往模板里面填写不同内容,但是模板的结构不能改变。同样的场景,有发送短信,发送邮件,发送后都需要记录日志,发送前还需要进行内容校验,防止有一些不法信息。用模板模式,就需要提取出发短信和发邮件两个操作的共同点,有两个,第一个是内容拦截,第二个是记录日志,而不同点是发送的执行,这需要让他们自己去做。定义出一个如上图所示的UML图,SenderService是一个抽象类,其中有模板方法。抽象方法send()是让子类自己实现,log()方法可以实现也不可实现。i原创 2022-04-05 06:57:27 · 101 阅读 · 0 评论 -
设计模式之策略模式
定义了一系列的算法,并将每一个算法封装起来,使他们可以相互替换。这就是策略模式的定义,转换下概念,定义了一系列的类,并将每一个类的实现封装起来,使他们可以随调用者使用。凡是用到if - else的条件判断,都可以考虑考虑是否可以使用策略模式。假如有这么一个场景,用户可以选择发短信,也可以选择发邮件?这就是一个if - else 的判断。那么按照策略模式定义,那就要定义两个类供用户使用。public class MailService { public void send(String co原创 2022-04-04 12:38:52 · 137 阅读 · 0 评论 -
设计模式之享元模式
先看下定义: 允许使用对象共享来有效地支持大量细粒度对象提取关键词,共享对象,也就是说这个对象是共享的,那么也就是说是被继承或者实现的。而一般继承或者实现都是应该有很多共性,所以被抽取出共性。所以当程序中存在很多共性的地方,只是根据外部调用会有些变化时,那么可以考虑享元模式。这种模式可以参考连接池,多个连接放在连接池中,如果有需要就从池里面拿,用完了就放回到池里面。而连接池一般都是先创建好,然后从池里面取,说到先初始化数据,那么就要考虑到工厂模式。按照连接池方式,那么就创建两个Dao。用工厂原创 2022-04-04 10:57:04 · 272 阅读 · 0 评论 -
设计模式之组合模式
顾名思义,组合模式允许以相同的方式处理单个对象和对象的组合体。也就是说这个组合类可以处理单个的对象,也可以处理对象的集合。单节点组合如上图所示,定义了一个工厂,产生消息对外的一个类,用于外部调用。定义一个抽象类(SenderService),用于规范一些操作。SmsService这个类才是应用了组合的类,这里面最重要的是这个List , 自己添加自己?/** * @author lw * @date 2022/3/29 0029 * @description 短信服务 */pub原创 2022-04-04 10:54:37 · 134 阅读 · 0 评论 -
设计模式之外观模式
外观模式就是提供一个统一的接口供外界调用,以降低内部逻辑复杂性。如上图,还是拿目前最常用的模式来说,这个SmsServiceImpl里面在发送短信时,调用了一大堆其他内部逻辑。要记录日志,要插入表数据,要调用外部接口发邮件等等。如果要每次send(Sms)后都需要自己手动调用一次 LogService,DBService等里面的方法执行逻辑,我想谁都不愿意。那么此处提供一个统一的接口,这个接口给controller调用,controller并不知道SmsService内部做了什么逻辑,他只需要知道原创 2022-04-04 10:51:11 · 281 阅读 · 0 评论 -
设计模式之桥接模式
将抽象部分与它的实现部分分离,使它们都可以独立地变化。就说一个场景,如下图所示,有SmsService和MailService两个服务,分别负责发短信和发邮件。同时有三个日志服务,负责记录日志等。在发送短信或者邮件后,需要记录日志,那么此时需要记录DB,File,Server三种日志,而后续还有很多日志服务要接入进来。甚至后面不仅仅是sms和mail两种消息服务,还有其他消息服务过来。问,如何快速适应变化,能在无论增加消息服务还是日志服务后能快速扩展,而不用写太多代码。/** * @auth原创 2022-04-04 10:44:28 · 278 阅读 · 0 评论 -
设计模式之代理模式
代理模式定义为提供一种方式以限制对被代理对象的访问控制。也就是说不会让你直接接触到被代理对象,一切对外操作由代理对象来产生。普通代理如上图所示,就先来写一个代理类,SmsProxyService,以后发短信的操作就交给代理类来执行。/** * @author lw * @date 2022/3/29 0029 * @description 代理对象 */public class SmsProxyService implements SmsService { //需要代理的对象原创 2022-04-04 10:34:52 · 119 阅读 · 0 评论 -
设计模式之装饰器模式
顾名思义,就是给以前的类装饰一下,增加一些其他功能呗。还是上面SmsService这个类,这个类里面纯粹是发送短信,记录日志。假如,这个类里面需要记录一张新表的日志呢?独属于项目组自己的日志。方案A、修改jar包中代码,增加记录项目组自己的日志代码。(呵呵,会被打死吧)方案B、把这个类调用时重新写一下。这应该是所有互联网行业写Service的通用方式了,定义一个接口,然后定义一个实现类。其实这里要吐槽一下,很多时候这个SmsService压根就没卵用,还要多写一些代码。但是当你用装饰器时,你原创 2022-04-04 10:30:27 · 149 阅读 · 0 评论 -
设计模式之适配器模式
适配器,也叫做包装器,顾名思义,就是设计一个转接头,用来连接两个无法正常对接的类。有这么一个场景,项目之初有人写了SmsService用于发短信,记录日志,同时将这个打成jar包,用于给多个项目组使用。/** * @author lw * @date 2022/3/28 0028 * @description jar包里的短信服务 */public class SmsService { public void send(String toPhone,String content){原创 2022-04-04 10:28:11 · 264 阅读 · 0 评论 -
设计模式之单例模式
单例模式定义为某个类在系统中只能有一个实例。这也是我当初认为是最简单的设计模式。常用写法以前一般写单例模式都是写成如下代码,public class SmsInstance { private final static SmsInstance smsInstance = new SmsInstance(); private SmsInstance(){ } public static SmsInstance getSmsInstance(){ r原创 2022-04-04 10:25:50 · 130 阅读 · 0 评论 -
设计模式之建造者模式
定义是: 将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示这句话很空泛,很抽象,看这句话基本看不懂。但是可以从上面知道,构建可以创建不同表示,那就是说new一个对象出来,有不同的结果呗。一般方式那么下面就看这个类,/** * @author lw * @date 2022/3/28 0028 * @description 短信发送 */@Datapublic class SmsSender { //移动发送短信需要的入网条件 private S原创 2022-04-04 10:22:30 · 292 阅读 · 0 评论 -
设计模式之工厂模式
顾名思义,由工厂创建对象,返回对象给你,而你不需要关心对象的创建,你只需要获取到对象,执行与对象相关逻辑即可。假设,需要发送邮件和发送短信,你不需要关心邮箱对象是怎么创建的,内部有什么初始化,只需要获取到邮箱对象,然后sendMail即可。普通工厂模式如上图的模式,CommonFactory使用produce负责生产出对应的发送设备,根据传入的参数决定是邮件发送,还是短信发送。不需要关心MailSender和SmsSender发送需要什么初始化条件,完全由工厂去初始化。用户只需要拿到Sender原创 2022-04-02 11:28:01 · 153 阅读 · 0 评论