设计模式

[TOC]

责任链模式

这是一个面向对象的思想,当存在可分的,多步骤的且连续的和顺序的事务要进行处理时,我们通过将每个部分抽离成一个handler对象处理这一个过程,将每个对象以或链表或存储集合,形成一个有序链条,依次执行handler对象的方法,从而完成整个事务的设计思想叫做责任链模式。

登录处理

public void login(String loginName,String loginPass){
    {
        //参数校验
        //...
    }
    {
        //用户信息校验
        //...
    }
    {
        //权限信息校验
        //...
    }
}

这样的检验性代码一般都是必不可少的,但是写在具体的业务代码中又显得非常臃肿,如果使用责任链模式,将步骤拆分,可以使我们在编码时更加专注于某一个具体的业务逻辑处理。

使用责任链模式

通过单向链表的结构,将每个步骤串联起来

然后再将他们串联起来

如果还没有体会到责任链模式的好处,我们可以看看Mybatis是如何使用责任链模式的。

Mybatis在实现用户自定义对执行SQL的功能增强例如日志记录、性能统计、分页查询、动态参数处理等等时,就通过拦截器使用了责任链模式

本质是:我们在进行拦截的时候,有很多的需求需要处理,于是采用责任链模式将拦截后对其处理拆分成若干个Intercepter(类似于Handler,但是优于handler),从而可以使我们在编码时更加专注于某一个具体的业务逻辑处理。

spring boot启动的时候要扫描Mapper并注册到

Mybatis Mapper的bean的存储是一个Map,key就是Mapper接口首字母小写的名称,value会根据设置的beanClass创建出一个MapperFactoryBean

21:34:05-1689341644720.png

SqlSessionFactoryBean在调用buildSqlSessionFactory()生成SqlSessionFactory实例的时候,会给它的成员变量Configuration对象添加拦截器

17:07:32-1689325652627.png

在Configuration对象里的IntercepterChain里,用一个list集合维护所有拦截器,从这里我们已经可以看到责任链模式的影子了,每一个拦截器对应一个事务处理

interceptorChain.pluginAll传入代理对象,将所有拦截器加到代理对象上

21:00:59-1689339659250.png

用户通过XML、配置类、注解等方式进行拦截器的注册,从而实现功能的增强

21:21:57-1689340917237.png

重写Intercept方法

遍历interceptors,interceptor.plugin(target)传入target代理对象

17:15:58-1689326158629.png

过程:给target加上一个插件-->interceptor1(target)-->再赋值给target

遍历下一个interceptor,再给target加上一个插件-->interceptor2(interceptor1(target))以此类推

最后返回一个加满插件的代理对象

执行该对象的invoke方法:

建造者模式

首先,我们可以结合上面的责任链模式,进行一个基于建造者模式的改造升级

在处理器Handler中增加一个静态内部类Builder建造者,用于为维护该链表

因为建造者模式要构建的是节点处理者,所以我们把Builder作为Handler的静态内部类,并且因为用户不需要进行链式组装,所以还可以把链式组装方法next()方法设置为private,使Handler更加高聚合

装饰器模式

模板模式

模板方法,模式在一个方法中定义一个算法(业务逻辑)骨架(模板),并将某些步骤推迟到子类中实现。模板方法模式可以让子类在不改变算法(业务逻辑)整体架构的情况下,重新定义算法(业务逻辑)中的某些步骤。

模板模式主要是用来解决复用和扩展两个问题。

复用

模板模式把一个业务逻辑中不变的流程抽象到父类的模板方法 templateMethod() 将,将可变的部分 method1()、method2()作为抽象方法留给子类 ContreteClass1 和 ContreteClass2 来实现。所有的子类都可以复用父类中模板方法定义的流程代码。

扩展

模板模式的第二大作用的是扩展。这里说的扩展,并不是指代码的扩展性,而是指框架的扩展性,有点类似控制反转。基于这个作用,模板模式常用在框架的开发中,让框架用户在可以不修改框架源码的情况下,定制化框架的功能。

典型案例:Tomcat中的Servlet就使用到了模板模式

GenericServlet

将固定好的实现写好,用户不需要关心的实现细节封装起来,留下抽象方法供子类重写

针对于web开发,HttpServlet对GenericServlet进一步抽象,在此基础上增加了一些针对HTTP协议的处理方法和属性

用户只需要关心具体需要实现的业务逻辑

适配器模式

单例模式

Last updated