
设计模式
提高复杂代码的设计和开发能力;让读源码、学框架事半功倍
法毅的博客
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
命令模式
// 定义:将请求封装成对象,以便使用不同的请求// 命令模式解决了应用程序中对象的职责以及它们之间的通信方式,发送者和接收者完全解耦// 命令的接口 interface Command{ void execute(); } // 命令接收人 static class Wife { private String name; public Wife(String name) { t.原创 2021-03-04 21:56:02 · 167 阅读 · 4 评论 -
观察者模式
观察者模式(Observer Design Pattern)也被称为发布订阅模式 在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知public interface Subject { void registerObserver(Observer observer); void removeObserver(Observer observer); void notifyObservers(Message message);}public int原创 2021-10-30 09:40:29 · 110 阅读 · 0 评论 -
模板模式
概念:模板模式主要是用来解决复用和扩展两个问题 复用指的是,所有的子类可以复用父类中提供的模板方法的代码。扩展指的是,框架通过模板模式提供功能扩展点,让框架用户可以在不修改框架源码的情况下,基于扩展点定制化框架的功能。复用:Java IO 类库中,有很多类的设计用到了模板模式,比如 InputStreamread() 函数是一个模板方法,定义了读取数据的整个流程,并且暴露了一个可以由子类来定制的public abstract class InputStream impl原创 2021-10-30 10:31:24 · 185 阅读 · 0 评论 -
装饰者模式
我们现在需要定义一个资源池配置类 ResourcePoolConfig,这个类里面的有成员变量有几个成员变量。因为 maxTotal、maxIdle、minIdle 不是必填变量,所以在创建 ResourcePoolConfig 对象的时候,我们通过往构造函数中,给这几个参数传递 null 值,来表示使用默认值。public class ResourcePoolConfig { private static final int DEFAULT_MAX_TOTAL = 8; priva原创 2021-07-06 10:54:54 · 111 阅读 · 1 评论 -
适配器模式
类适配器类适配器使用继承关系来实现interface ITarget { void f1(); void f2(); void fc();}class Adaptee { public void fa() { } public void fb() { } public void fc() { }}class Adaptor extends Adaptee implements ITarget {原创 2021-12-08 00:30:09 · 119 阅读 · 0 评论 -
职责链模式
多个处理器依次处理同一个请求。一个请求先经过 A 处理器处理,然后再把请求传递给 B 处理器,B 处理器处理完后再传递给 C 处理器,以此类推,形成一个链条。链条上的每个处理器各自承担各自的处理职责,所以叫作职责链模式。示例:使用职责链实现敏感词过滤public interface SensitiveWordFilter { boolean doFilter(Content content);}public class SexyWordFilter implements Sensitiv原创 2021-12-08 23:37:39 · 236 阅读 · 0 评论 -
组合模式+访问者模式 实现商品多级目录分类
商城有很多商品目录,且层级很多。为了对层级目录进行管理,需要满足对层级目录的增删。原创 2023-01-18 15:49:04 · 793 阅读 · 0 评论 -
建造者模式+原型模式 实现发票开具功能
支付成功之后开具增值发票,由于发票所需内容较多,而且随着国家政策可能会有所更改,发票内容的添加和删除以及后台对象的组装尽量做到灵活。建造者模式是将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。发票工具不是高并发访问接口,且无法缓存,使用原型模式尽量保证发票创建的性能。用户支付完成后,部分企业用户或个人账户需要开电子增值税发票,实现该功能。原创 2022-12-28 22:58:43 · 470 阅读 · 0 评论 -
桥接模式 实现第三方账号登录
它的主要职责是定义出该角色的行为, 同事保存一个对实现化角色的引用,该角色一般是抽象类它引用实现化角色对抽象化角色进行修正。原创 2023-01-02 18:52:04 · 670 阅读 · 0 评论 -
迭代器模式 实现ES大量数据查询
数据从Mysql 迁移到 Es, Es查询数据默认fetch Size最大为10000条,如果查询超过1万条,需要通过scroll形式进行查询。原创 2023-01-02 16:10:43 · 2240 阅读 · 1 评论 -
状态模式+观察者(监听器模式)实现订单状态变更
用户从开始下订单,到支付完成,再到物流部进行发货,最终用户确认收货。触发订单状态变化的操作:支付订单;整个流程涉及到很多订单状态,需要通过代码对订单状态进行管理。订单状态包括:待支付;订单完成(状态模式)用户创建订单-> 支付订单->发货->收货->订单完成。用户确认收货操作导致订单状态变为订单完成状态。物流部门发货操作导致订单状态变为待收货状态。用户创建订单操作导致订单状态为待支付状态。用户支付操作导致订单状态变为待发货状态。创建订单完成后,订单状态初始化为待支付。设计整体结算发货以及收货的流程。原创 2022-12-31 23:26:38 · 1996 阅读 · 0 评论 -
享元模式 优化添加积分的对象创建
【代码】 享元模式。原创 2022-12-19 16:27:21 · 161 阅读 · 0 评论 -
装饰器模式 实现用户支付成功后添加用户的积分
新建抽象的 AbstractPayContext 类,使用 PayContext 继承 AbstractPayContext。新建 AddPointDecrator 类,继承 AddPointContext 实现具体的业务逻辑。新建抽象的装饰器类 AddPointContext 继承 AbstractPayContext。原创 2022-12-18 19:14:33 · 140 阅读 · 0 评论 -
策略模式 + 工厂模式 + 门面模式 实现用户多类型支付功能
策略模式 + 工厂模式 + 门面模式 实现用户多类型支付功能原创 2022-10-31 00:38:26 · 1118 阅读 · 0 评论 -
门面模式
1.定义:门面模式为子系统提供一组统一的接口,定义一组高层接口让子系统更易用。2.好处:解决性能:假设有一个系统 A,提供了 a、b、c、d 四个接口。系统 B 完成某个业务功能,需要调用 A 系统的 a、b、d 接口。利用门面模式,我们提供一个包裹 a、b、d 接口调用的门面接口 x,给系统 B 直接使用。假设我们刚刚提到的系统 A 是一个后端服务器,系统 B 是 App 客户端。App 客户端通过后端服务器提供的接口来获取数据。我们知道,App 和服务器之间是通过移动网络通信的,网络通信耗时原创 2022-03-21 22:32:58 · 218 阅读 · 0 评论 -
行为型-策略模式
策略类的定义比较简单,包含一个策略接口和一组实现这个接口的策略类。因为所有的策略类都实现相同的接口 常见的应用场景是,利用它来避免冗长的 if-else 或 switch 分支判断,一般配合工厂使用// 策略的定义public interface DiscountStrategy { double calDiscount(Order order);}// 省略NormalDiscountStrategy、GrouponDiscountStrategy、PromotionDiscountSt原创 2020-09-01 21:27:07 · 265 阅读 · 0 评论 -
行为型-观察者模式
定义:在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。一般情况下,被依赖的对象叫作被观察者(Observable),依赖的对象叫作观察者(Observer)。在Spring中的应用:Spring 中实现的观察者模式包含三部分:Event 事件(相当于消息)、Listener 监听者(相当于观察者)、Publisher 发送者(相当于被观察者)// Event事件public class DemoEvent extends ApplicationEv原创 2020-08-26 23:26:00 · 190 阅读 · 0 评论 -
行为型-责任链模式
多个处理器依次处理同一个请求。一个请求先经过 A 处理器处理,然后再把请求传递给 B 处理器,B 处理器处理完后再传递给 C 处理器,以此类推,形成一个链条。链条上的每个处理器各自承担各自的处理职责,所以叫作职责链模式。 用来实现框架的过滤器、拦截器功能,让框架的使用者在不需要修改框架源码的情况下,添加新的过滤拦截功能示例:使用职责链实现敏感词过滤public interface SensitiveWordFilter { boolean doFilter(Content content);原创 2020-08-31 21:38:09 · 308 阅读 · 1 评论 -
行为型-模板方法模式
模板方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤。 两大作用是复用和扩展public abstract class AbstractClass { public final void templateMethod() { //... method1(); //... method2(); //... } protected abstract v原创 2020-08-30 17:53:56 · 208 阅读 · 0 评论 -
结构型-装饰器模式
装饰器模式主要解决继承关系过于复杂的问题,通过组合来替代继承。它主要的作用是给原始类添加增强功能 代理模式中,代理类附加的是跟原始类无关的功能,而在装饰器模式中,装饰器类附加的是跟原始类相关的增强功能// 代理模式的代码结构(下面的接口也可以替换成抽象类)public interface IA { void f();}public class A impelements IA { public void f() { //... }}public class AProxy imple原创 2020-06-04 21:47:55 · 350 阅读 · 0 评论 -
结构型-适配器模式
目录两种实现方式类适配器对象适配器应用场景封装有缺陷的接口设计统一多个类的接口设计替换依赖的外部系统概述核心原理:通过组合的方式,将需要适配的类转换成使用者能够使用的接口 适配器模式可以看作一种“补偿模式”,用来补救设计上的缺陷,不是在详细设计时添加的,而是解决正在服役的项目的问题两种实现方式类适配器类适配器使用继承关系来实现interface ITarget { void f1(); void f2()原创 2020-04-25 20:59:20 · 486 阅读 · 0 评论 -
创建型-建造者模式
我们现在需要定义一个资源池配置类 ResourcePoolConfig,这个类里面的有成员变量有几个成员变量。因为 maxTotal、maxIdle、minIdle 不是必填变量,所以在创建 ResourcePoolConfig 对象的时候,我们通过往构造函数中,给这几个参数传递 null 值,来表示使用默认值。public class ResourcePoolConfig { private static final int DEFAULT_MAX_TOTAL = 8;原创 2020-04-22 00:45:00 · 236 阅读 · 0 评论 -
创建型-工厂模式
简单工厂定义:由一个工厂对象决定创建出哪一种产品类的实例public class RuleConfigSource { public RuleConfig load(String ruleConfigFilePath) { String ruleConfigFileExtension = getFileExtension(ruleConfigFilePath); IRuleConfigParser parser = null; if ("json".equalsIgn原创 2020-04-21 23:12:38 · 601 阅读 · 0 评论 -
结构型-代理模式
代理模式:在不改变原始类(或叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能。1.静态代理静态代理:静态代理需要为每一个对象都创建一个代理类,增加了维护成本以及开发成本public interface Subject { // 共同的接口 void doSomething();}public class RealSubject implements Subject { // 真实对象 @Override public void doSomet原创 2020-04-19 23:41:37 · 260 阅读 · 0 评论 -
创建型-单例模式
目录需要考虑的问题创建单例的几种方式饿汉式懒汉式双重检测锁模式静态内部类枚举定义:一个类只允许创建一个对象或者实例需要考虑的问题构造函数需要是 private 访问权限的,这样才能避免外部通过 new 创建实例 考虑对象创建时的线程安全问题 考虑是否支持延迟加载 考虑 getInstance() 性能是否高(是否加锁)创建单例的几种方式饿汉式在类加载的时候,instance 静态实例就已经创建并初始化好了,所以,instance 实例原创 2020-04-16 02:58:43 · 183 阅读 · 0 评论 -
设计模式原则
目录1.单一原则2.开闭原则3.里氏替换原则4.接口隔离原则5.DRY原则1.单一原则类中的代码行数、函数或属性过多,会影响代码的可读性和可维护性,我们就需要考虑对类进行拆分; 类依赖的其他类过多,或者依赖类的其他类过多,不符合高内聚、低耦合的设计思想,我们就需要考虑对类进行拆分; 私有方法过多,我们就要考虑能否将私有方法独立到新的类中,设置为 public 方法,供更多的类使用,从而提高代码的复用性; 比较难给类起一个合适名字,很难用一个业务名词概括,或者只能用一些笼统的原创 2020-04-16 00:30:29 · 424 阅读 · 0 评论