设计模式
[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

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

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

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

重写Intercept方法
遍历interceptors,interceptor.plugin(target)传入target代理对象

过程:给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