Mybatis中的设计模式

谈谈设计模式的几个原则

单一职责原则:一个类或者一个接口只负责唯一项职责,尽量设计出功能单一的接口;
依赖倒转原则:高层模块不应该依赖低层模块具体实现,解耦高层与低层。既面向接口编程,当实现发生变化时,只需提供新的实现类,不需要修改高层模块代码;
开放-封闭原则:程序对外扩展开放,对修改关闭;换句话说,当需求发生变化时,我们可以通过添加新模块来满足新需求,而不是通过修改原来的实现代码来满足新需求;

一、适配器模式Mybatis中日志模块

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁,将一个类的接口转换成客户希望的另外           一  个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 适用场景:当调用双方都不太容易修改的时候,为了复用现有组件可以使用适配器模式;在系统中接入第三方组件的时候经常被使用到;

           eg:Mybatis中日志模块

MyBatis没有提供日志的实现类,需要接入第三方的日志组件,但第三方日志组件都有各自的Log级别,且各不相同,二MyBatis统一提供了trace、debug、warn、error四个级别;
自动扫描日志实现,并且第三方日志插件加载优先级如下:slf4J → commonsLoging → Log4J2 → Log4J → JdkLog;
日志的使用要优雅的嵌入到主体功能中;

二、代理模式日志打印采

定义:给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用;
目的:(1)通过引入代理对象的方式来间接访问目标对象,防止直接访问目标对象给系统带来的不必要复杂性;

              (2)通过代理对象对原有的业务增强;

代理模式给我们带来的便利:
作为中介解耦客户端和真实对象,保护真实对象安全;(房屋中介)
防止直接访问目标对象给系统带来的不必要复杂性;(海外代购,SSH)
对业务进行增强,增强点多样化如:前入、后入、异常;(AOP)

    eg:mybatis中的日志打印采用的是代理模式:

          ConnectionLogger:负责打印连接信息和SQL语句,并创建PreparedStatementLogger;
           PreparedStatementLogger:负责打印参数信息,并创建ResultSetLogger
            ResultSetLogge:r负责打印数据结果信息;

三、工厂模式:mybatis中数据源

创建对象的方式:
使用new关键字直接创建对象;
通过反射机制创建对象;
通过工厂类创建对象;
缺点
对象创建和对象使用使用的职责耦合在一起,违反单一原则;
当业务扩展时,必须修改代业务代码,违反了开闭原则;
使用工厂的优点
把对象的创建和使用的过程分开,对象创建和对象使用使用的职责解耦;
如果创建对象的过程很复杂,创建过程统一到工厂里管理,既减少了重复代码,也方便以后对创建过程的修改维护;
当业务扩展时,只需要增加工厂子类,符合开闭原则;

eg:mybatis中数据源的创建采用的是工厂设计模式,,数据源的初始化过程参数较多,比较复杂

PooledConnection:使用动态代理封装了真正的数据库连接对象;
PoolState:用于管理PooledConnection对象状态的组件,通过两个list分别 管理空闲状态的连接资源和活跃状态的连接资源
PooledDataSource:一个简单,同步的、线程安全的数据库连接池

四、装饰器设计模式-mybatis中的缓存模块

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀;

优点 相对于继承,装饰器模式灵活性更强,扩展性更强;
灵活性:装饰器模式将功能切分成一个个独立的装饰器,在运行期可以根据需要动态的添加功能,甚至对添加的新功能进行自由的组合;
扩展性:当有新功能要添加的时候,只需要添加新的装饰器实现类,然后通过组合方式添加这个新装饰器,无需修改已有代码,符合开闭原则;

   eg:IO中输入流和输出流的设计就是完美的体现,mybatis中的缓存模块也是

五:建造者设计模式-Mybatis的初始化

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

需要生成的对象具有复杂的内部结构,实例化对象时要屏蔽掉对象内部的细节,让上层代码与复杂对象的实例化过程解耦,可以使用建造者模式;简而言之,如果“遇到多个构造器参数时要考虑用构建器”;
一个对象的实例化是依赖各个组件的产生以及装配顺序,关注的是一步一步地组装出目标对象,可以使用建造器模式;

六:策略模式-创建SqlSession

策略模式的使用场景:
针对同一类型问题的多种处理方式,仅仅是具体行为有差别时;
出现同一抽象类有多个子类,而又需要使用 if-else 或者 switch-case 来选择具体子类时

七、模板模式:Executor查询操作流程

个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定实现;

 

 

 

 

 

 

 

      

你可能感兴趣的:(mybatis总结)