mybatis 之 设计模式
Posted better_hui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis 之 设计模式相关的知识,希望对你有一定的参考价值。
目录
一、建造者模式
建造者模式(builder Pattern) : 使用多个简单的对象一步一步构建成一个复杂的对象。
mybatis中以Buidler结尾的对象基本上都是建造者模式。比如 SqlSessionFactoryBuilder,用以构建SqlSessionFactory对象。
mybatis中有一个很完整的构造者模式:
二、工厂模式
专门创建某种对象的工厂,对外是黑盒,我们需要getObject , 而不用关心内部实现。
mybatis中以factory结尾的类,使用的都是工厂模式。
-
SqlSeesionFactory : 创建SqlSession对象
-
ObjectFactory : 对象工厂
-
MapperProxyFactory : 这是一个大佬,用来创建映射器代理对象 , MapperProxy对象
三、单例模式
单例模式(singleton pattern) 是Java中最简单常用的设计模式,一个运行中的程序,只存在一个该class的对象实体。
比如 : LogFactory 、ErrorContext
四、代理模式
代理模式(Proxy Pattern ) , 一个类代表另一个类的功能。这种类型的设计模式属于结构性模式。
mybatis的核心就是代理模式的实现,每一个mapper 都会创建一个代理类 , 每一个插件Plugin 都会创建一个代理类
五、适配器模式
适配器模式 (Adapter Pattern) 是两个不兼容对象之间的桥梁,属于是结构型模式。这种模式涉及到一个单独的类型,封装兼容加入的多个不同类型。
在mybatis中定义了Log接口,我们可以接入不同的实现,只要是符合我的Log规范即可。
六、模板方法
模板方法(template pattern) , 一个抽象类公开定义执行流程,允许其子类自由实现具体步骤的逻辑,属于是行为型模式。
mybatis中 ,基类 BaseExecutor , 子类SimpleExecutor 、BatchExecutor 、ReuseExecutor
// 我们以更新方法为例 , BaseExecutor中定义的通用的逻辑 , 并提供了一个doUPdate的抽象接口,由子类实现。 public int update(MappedStatement ms, Object parameter) throws SQLException { ErrorContext.instance().resource(ms.getResource()).activity("executing an update").object(ms.getId()); if (closed) throw new ExecutorException("Executor was closed."); clearLocalCache(); return doUpdate(ms, parameter); } protected abstract int doUpdate(MappedStatement ms, Object parameter){ throws SQLException; }
七、装饰器模式
装饰器模式(Decorator Pattern)允许向一个现有对象添加新的功能,同时又不改变其原有结构,属于是结构型模式,它新建一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供额外的功能。
在Mybatis中,Cache的实现类LruCache、FifoCache等都是装饰一个类PerpetualCache。常见代码格式,就是装饰类中会有个被装饰类的属性,并且这个属性还是构造方法的参数。
public class LruCache implements Cache { //装饰类 持有原有类Cache的引用 private final Cache delegate; private Map<Object, Object> keyMap; private Object eldestKey; public LruCache(Cache delegate) { this.delegate = delegate; setSize(1024); } //在原有方法上扩展了cycleKeyList的逻辑 @Override public void putObject(Object key, Object value) { delegate.putObject(key, value); cycleKeyList(key); } }
八、责任链模式
责任链模式(Chain of Responsilility Pattern) 为请求创建一个接受者对象的链。这种模式给予请求的类型,对请求的发送者和接受者解耦,属于是行为型模型。
public class InterceptorChain { private final List<Interceptor> interceptors = new ArrayList<Interceptor>(); //这就是责任链 public Object pluginAll(Object target) { for (Interceptor interceptor : interceptors) { target = interceptor.plugin(target); } return target; } }
以上是关于mybatis 之 设计模式的主要内容,如果未能解决你的问题,请参考以下文章
JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段