随笔分类 - 设计模式
摘要:这应该算是比较难理解的一个模式了。 这种模式一般针对于被访问者类是固定,而访问者是经常变化的场景。 目前此类暂不做过多描述,我自己也没完全掌握,每次写完代码后可以看一遍访问者模式,看看是否可以改成访问者模式。 被访问者 /** * @author lw * @date 2022/4/1 0001 *
阅读全文
摘要:定义: 当对象的状态改变,其行为也会改变。 一般理解为,一个对象在不同的状态会有不同的方法调用。 比如在短信发送中,短信分为未发送,发送成功,发送失败等三个状态。 每一个状态的改变都需要有对应的动作处理。 /** * @author lw * @date 2022/3/29 0029 * @desc
阅读全文
摘要:定义是: 不破坏对象封装性,保存对象的内部状态。 它有个别名: 备份和恢复模式 如下所示,有个变量a,但是a的内容错了,现在要把a的内容换一下。 String a="a"; //····一系列操作后····a=1234567 //此时a的原来数据就丢失了。 String temp = a;//如果在
阅读全文
摘要:定义: 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。 先转换概念: 将一个命令封装为一个对象,使发出命令的对象和执行命令的对象分割开。 提取关键词: 命令=对象,发出命令的对象,执行命令的对象。需要3个对象。 如上所示,定义了三个对象,扩展了两个具体命令。 命令发送方 /**
阅读全文
摘要:顾名思义,这是一个链式传递,将责任一层一层传递,最终找到背锅的那位。 提取关键词: 链式传递,最终者。 那么必然前面一位要知道怎么把这个锅传给后面一位,要是都不知道后面一位是谁,怎么传递责任。 如同上图一样,假如一个系统出问题了,总监问主任,主任找部长,部长找组长,组长最终让程序员找原因,这样层层传
阅读全文
摘要:此模式看下图就知道了,用来遍历访问ArrayList中数据对象,而不会暴露内部逻辑。 在ArrayList中有一个迭代器,Itr,用来访问ArrayList中的数据。 一般调用方式如下, List<String> list = new ArrayList<>(); Iterator<String>
阅读全文
摘要:定义: 多个对象间存在一对多关系,当一个对象发生改变时,会把这种改变通知给其他多个对象,从而影响其他对象的行为。 首先提取关键词,多个对象、一对多关系,通知其他对象。 根据上述关键词定义一个多的对象(SmsTarget),定义一个改变的量(SmsPool.smsContent),再定义通知方法not
阅读全文
摘要:顾名思义,定义一个模板,使用模板的子类可以往模板里面填写不同内容,但是模板的结构不能改变。 同样的场景,有发送短信,发送邮件,发送后都需要记录日志,发送前还需要进行内容校验,防止有一些不法信息。 用模板模式,就需要提取出发短信和发邮件两个操作的共同点,有两个,第一个是内容拦截,第二个是记录日志, 而
阅读全文
摘要:定义了一系列的算法,并将每一个算法封装起来,使他们可以相互替换。 这就是策略模式的定义,转换下概念,定义了一系列的类,并将每一个类的实现封装起来,使他们可以随调用者使用。 凡是用到if - else的条件判断,都可以考虑考虑是否可以使用策略模式。 假如有这么一个场景,用户可以选择发短信,也可以选择发
阅读全文
摘要:先看下定义: 允许使用对象共享来有效地支持大量细粒度对象 提取关键词,共享对象,也就是说这个对象是共享的,那么也就是说是被继承或者实现的。 而一般继承或者实现都是应该有很多共性,所以被抽取出共性。 所以当程序中存在很多共性的地方,只是根据外部调用会有些变化时,那么可以考虑享元模式。 这种模式可以参考
阅读全文
摘要:顾名思义,组合模式允许以相同的方式处理单个对象和对象的组合体。 也就是说这个组合类可以处理单个的对象,也可以处理对象的集合。 单节点组合 如上图所示,定义了一个工厂,产生消息对外的一个类,用于外部调用。 定义一个抽象类(SenderService),用于规范一些操作。 SmsService这个类才是
阅读全文
摘要:外观模式就是提供一个统一的接口供外界调用,以降低内部逻辑复杂性。 如上图,还是拿目前最常用的模式来说,这个SmsServiceImpl里面在发送短信时,调用了一大堆其他内部逻辑。 要记录日志,要插入表数据,要调用外部接口发邮件等等。 如果要每次send(Sms)后都需要自己手动调用一次 LogSer
阅读全文
摘要:将抽象部分与它的实现部分分离,使它们都可以独立地变化。 就说一个场景,如下图所示,有SmsService和MailService两个服务,分别负责发短信和发邮件。 同时有三个日志服务,负责记录日志等。 在发送短信或者邮件后,需要记录日志,那么此时需要记录DB,File,Server三种日志,而后续还
阅读全文
摘要:代理模式定义为提供一种方式以限制对被代理对象的访问控制。 也就是说不会让你直接接触到被代理对象,一切对外操作由代理对象来产生。 普通代理 如上图所示,就先来写一个代理类,SmsProxyService,以后发短信的操作就交给代理类来执行。 /** * @author lw * @date 2022/
阅读全文
摘要:顾名思义,就是给以前的类装饰一下,增加一些其他功能呗。 还是上面SmsService这个类,这个类里面纯粹是发送短信,记录日志。 假如,这个类里面需要记录一张新表的日志呢?独属于项目组自己的日志。 方案A、修改jar包中代码,增加记录项目组自己的日志代码。(呵呵,会被打死吧) 方案B、把这个类调用时
阅读全文
摘要:适配器,也叫做包装器,顾名思义,就是设计一个转接头,用来连接两个无法正常对接的类。 有这么一个场景,项目之初有人写了SmsService用于发短信,记录日志,同时将这个打成jar包,用于给多个项目组使用。 /** * @author lw * @date 2022/3/28 0028 * @desc
阅读全文
摘要:单例模式定义为某个类在系统中只能有一个实例。 这也是我当初认为是最简单的设计模式。 常用写法 以前一般写单例模式都是写成如下代码, public class SmsInstance { private final static SmsInstance smsInstance = new SmsIns
阅读全文
摘要:定义是: 将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示 这句话很空泛,很抽象,看这句话基本看不懂。 但是可以从上面知道,构建可以创建不同表示,那就是说new一个对象出来,有不同的结果呗。 一般方式 那么下面就看这个类, /** * @author lw * @date 20
阅读全文
摘要:顾名思义,由工厂创建对象,返回对象给你,而你不需要关心对象的创建,你只需要获取到对象,执行与对象相关逻辑即可。 假设,需要发送邮件和发送短信,你不需要关心邮箱对象是怎么创建的,内部有什么初始化,只需要获取到邮箱对象,然后sendMail即可。 普通工厂模式 如上图的模式,CommonFactory使
阅读全文