文章目录
I . 适配器模式概念
II . 适配器模式 适用场景
III . 适配器模式 优缺点
IV . 适配器模式 与 外观模式对比
V . 适配器模式 相关角色 ( 重点 )
VI . 适配器模式 ( 类适配器 ) 代码实现流程 ( 重点 )
VII . 适配器模式 ( 对象适配器 ) 代码实现流程 ( 重点 )
I . 适配器模式概念
适配器模式 :
① 设计模式类型 : 结构型 ;
② 概念 : 将 类的接口 转换成用户可以调用的 另外一个接口 ;
③ 目的 : 使接口不兼容的两个类可以一起工作 ;
④ 概念中的三个角色 : 被适配者 ( 现有的功能类 ) , 用户目标接口 ( 用户调用的接口 ) , 适配器类 ( 用户通过调用该类 , 间接调用 被适配者类 ) ;
⑤ 简易原理 : 适配器类 实现用户目标接口 , 在该接口的实现类中调用被适配者 , 实现了接口转接的效果 ; 使用的时候 , 通过创建适配器类 , 即可间接调用被适配者方法 ;
II . 适配器模式 适用场景
1 . 功能正确但接口不匹配 : 对于之前开发好的类 , 该类的操作和返回值都是正确的 , 但是其定义的方法接口无法调用 , 此时使用适配器模式 , 使该类与用户的接口匹配 , 让用户使用适配器的接口 , 间接调用该类 ;
2 . 适配器模式使用阶段 : 软件设计开发阶段一般不使用适配器模式 , 在软件维护时 , 出现操作和返回值类似 , 但是函数接口不同 , 为了适配第三方系统的接口 , 使用适配器模式 ;
设计阶段不要使用适配器模式 ;
3 . 适配器的两种实现方式 : 对象适配器模式 与 类适配器 ;
① 对象适配器 : 符合组合复用原则 , 使用了委托机制 ; ( 通过组合实现 , 适配器类中维护被适配者成员 )
② 类适配器 : 通过类的继承实现适配器模式 ; ( 通过继承实现 , 适配器类继承被适配者类 )
推荐使用对象适配器模式 , 在继承与组合二者之间 , 优先选择组合方案 ;
III . 适配器模式 优缺点
1 . 适配器模式 优点 :
① 复用且不修改类 : 不改变现有类的基础上 , 提高类的复用性 , 透明性 ; 让现有类与目标类接口匹配 ;
② 降低耦合 : 目标类 ( 用户调用的接口所在类 ) 和 现有类 ( 被适配者 ) 解除耦合 , 降低了系统的耦合性 , 易于扩展维护 ;
③ 符合开闭原则 : 用户调用适配器接口 , 只与适配器类进行交互 , 如果需要修改扩展 , 只需要修改适配器类即可 , 目标类 和 现有类 各自都是相互独立的 , 互不影响 ;
2 . 适配器模式 优点 :
① 增加复杂性 : 编写适配器类时 , 需要考虑全面 , 包括被适配者 和 目标类 , 系统复杂性会增加 ;
② 降低可读性 : 系统代码可读性降低 , 可维护性降低 ;
阅读代码时 , 调用系统接口 , 如果调用的是适配器接口 , 还要到处找调用的是哪个现有类的实际接口 ;
IV . 适配器模式 与 外观模式对比
1 . 相同点 : 都是对现有类进行封装 ;
2 . 行为分析 :
① 外观模式行为 : 外观模式定义了新街口 , 处理多个子系统之间的交互 ;
② 适配器模式行为 : 适配器模式复用原有接口 , 只是简单的转接了一下 , 使两个现存接口 ( 现有类 和 目标类 ) 协同工作 ;
3 . 适配力度分析 :
① 外观模式 : 适配力度很大 , 需要开发整个子系统之间的交互流程 ;
② 适配器模式 : 修改很少的内容 , 只是进行简单的接口转接交互 , 一般不实现具体的功能 ;
V . 适配器模式 相关角色 ( 重点 )
1 . 被适配者 : 实际功能提供者 , 是系统中原有的类 ;
2 . 用户目标接口 : 用户调用该接口 , 实现功能操作 ; 是适配器的父类接口 ;
3 . 适配器 : 需要实现 用户目标接口 , 并在接口中的操作中 , 调用被适配者提供的实际功能 ; 适配器有两种途径实现 , 分别是类适配器 , 对象适配器 ;
① 类适配器 : 继承被适配者 , 通过 super 访问被适配者方法 ;
② 对象适配器 ( 推荐 ) : 在适配器中维护一个被适配者成员变量 , 通过成员变量访问被适配者方法 ;
VI . 适配器模式 ( 类适配器 ) 代码实现流程 ( 重点 )
1 . 明确被适配者 : 被适配者 是一个现有类 , 该类保持不变 ;
2 . 定义用户目标接口 : 用户通过调用该接口 , 实现实际的功能 , 该功能与适配者中的功能类似 , 但 接口不同 ;
3 . 声明适配器 ( 类适配器 ) :
① 适配器 实现 用户目标接口 : 适配器 需要实现 用户目标接口 , 在实现的接口方法中 , 需要将实际操作 委托给 被适配者 ;
② 适配器 继承 被适配者 : 如何调用到 被适配者 的方法呢 , 这里 适配器 通过 继承 被适配者 , 获取调用 被适配者 方法的资格 ;
③ 委托操作 : 在实现的 用户目标接口中 , 通过 super 关键字 , 调用 被适配者 的方法实现具体功能 ;
类适配器 与 对象适配器 , 本质区别就是 适配器类访问 被适配者的途径 ;
类适配器 : 通过继承 被适配器 , 获取访问被适配器方法的资格 ;
对象适配器 : 通过在其内部维护一个 被适配者 成员变量 , 进而通过该成员变量访问 被适配者方法 ;
4 . 用户访问操作 :
① 定义目标接口变量 : 定义 用户目标接口 对象变量 ;
② 目标接口变量赋值 : 创建 适配器对象 赋值给上述 用户目标接口对象变量 , ( 适配器 是 用户目标接口 的子类 ) ;
③ 目标接口调用 : 调用用户目标接口 , 即可调用被适配者的实际功能方法 ;
VII . 适配器模式 ( 对象适配器 ) 代码实现流程 ( 重点 )
1 . 明确被适配者 : 被适配者 是一个现有类 , 该类保持不变 ;
2 . 定义用户目标接口 : 用户通过调用该接口 , 实现实际的功能 , 该功能与适配者中的功能类似 , 但 接口不同 ;
3 . 声明适配器 :
① 适配器 实现 用户目标接口 : 适配器 需要实现 用户目标接口 , 在实现的接口方法中 , 需要将实际操作 委托给 被适配者 ;
② 适配器 维护 被适配者 类型成员变量 : 如何调用到 被适配者 的方法呢 , 这里 适配器 通过 定义 被适配者 类型的成员变量 , 通过该 被适配者 类型成员变量 , 调用 被适配者 public 方法 ;
③ 委托操作 : 在实现的 用户目标接口中 , 通过 被适配者类型 成员变量 , 调用 被适配者 的方法实现具体功能 ;
类适配器 与 对象适配器 , 本质区别就是 适配器类访问 被适配者的途径 ;
类适配器 : 通过继承 被适配器 , 获取访问被适配器方法的资格 ;
对象适配器 : 通过在其内部维护一个 被适配者 成员变量 , 进而通过该成员变量访问 被适配者方法 ;
4 . 用户访问操作 :
① 定义目标接口变量 : 定义 用户目标接口 对象变量 ;
② 目标接口变量赋值 : 创建 适配器对象 赋值给上述 用户目标接口对象变量 , ( 适配器 是 用户目标接口 的子类 ) ;
③ 目标接口调用 : 调用用户目标接口 , 即可调用被适配者的实际功能方法 ;