Java设计模式精讲—课程笔记6
12 适配器模式讲解+Coding+源码解析
12.1 适配器模式讲解
- 定义:将一个类的接口转换成客户期望的另一个接口;
使原本接口不兼容的类可以一起工作;
类型:结构型; - 适用场景:
已经存在的类,它的方法和需求不匹配时(方法结果相同或相似);
不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品、不同厂家造成功能类似而接口不相同情况下的解决方案; - 优点:
能提高类的透明性和复用,现有的类复用但不需要改变;
目标类和适配器类解耦,提高程序扩展性;
符合开闭原则; - 缺点:
适配器编写过程需要全面考虑,可能会增加系统的复杂性;
增加系统代码可读的难度; - 扩展:
对象适配器:符合组合复用原则,使用委托机制;
类适配器:通过类继承实现; - 相关设计模式:
适配器模式和外观模式:都是对现有类、现存系统的封装,外观定义了新的接口,适配器复用了原有的接口;适配器使两个已有的系统协同工作,外观给现有系统提供了更方便的访问入口;外观模式用来适配整个子系统,力度更大。
12.2 适配器模式coding
- 类适配器模式:通过继承;
对象适配器模式:通过组合; - 类适配器:
- 对象适配器:
- 案例:
选取对象适配器:继承和组合优先选择组合;
12.3 适配器模式源码解析(jdk+spring+springjpa+spingmvc)
- jdk:XmlAdapter
spring:AdvisorAdapter
springjap:JpaVendorAdapter
springmvc:HandlerAdapter
13 享元模式讲解+Coding+源码解析
13.1 享元模式讲解
- 定义:提供了减少对象数量从而改善应用所需的对象结构的方式;
运用共享技术有效地支持大量细粒度的对象;
类型:结构型;
(减少创建对象的数量,减少内存的占用,提高性能) - 适用场景:
常常应用于系统底层的开发,以便解决系统的性能问题;
系统有大量相似对象、需要缓冲池的场景; - 优点:
减少对象的创建,降低内存中对象的数量,降低系统的内存,提高效率;
减少内存之外的其他资源占用(时间、文件句柄、窗口句柄等); - 缺点:
关注内/外部状态、关注线程安全问题;
使系统、程序的逻辑复杂化; - 享元-扩展:
内部状态:在享元对象内部,且不随环境改变而改变的共享部分,类似于属性;
外部状态:记录在享元对象外部,会随环境变化; - 享元-相关设计模式:
享元模式和代理模式:代理模式要代理一个类,如果生成代理类花费的时间和资源较多,可用享元模式提高速度;
享元模式和单例模式:容器单例:享元模式和单例模式的结合;
13.2 享元模式Coding
- department:外部状态(声明在外部,依赖于外部传入参数);
内部状态:Manager title,不随外部变化而变化;
- 使用享元模式时,要关注线程安全问题;根据实际业务场景取舍;
(HashMap:未做到线程安全;)
13.3 享元模式源码解析(jdk+tomcat)
- Integer
缓存存储:-128 – 127; - Tomcat:GenericObjectPoolConfig
14 组合模式讲解+Coding+源码解析
14.1 组合模式讲解
- 定义:将对象组合成树形结构以表示“部分—整体”的层次结构;
组合模式使客户端对单个对象和组合对象保持一致的方式处理;
类型:结构型;
- 适用场景:
希望客户端可以忽略组合对象与单个对象的差异时;
处理一个树形结构时; - 优点:
清楚地定义分层次的复杂对象,表示对象的全部或部分层次;
让客户端忽略了层次的差异,方便对整个层次结构进行控制;
简化客户端代码;
符合开闭原则; - 缺点:
限制类型时会较为复杂;
使设计变得更加抽象; - 相关设计模式:
组合模式和访问者模式:组合应用,使用访问者模式访问组合模式中的递归结构
14.2 组合模式Coding
- 未实现的方法:在父类中设计了抛出异常;
14.3 组合模式源码解析(jdk+mybatis)
- java.awt.Component
Hashmap
java.util.ArrayList - mybatis:SqlNode,WhereSqlNode;
- 组合模式关键:叶子对象和组合对象要实现相同的接口,或继承相同抽象类,从而实现一致的处理;