zl程序教程

您现在的位置是:首页 >  其他

当前栏目

【设计模式】适配器模式 ( 概念 | 适用场景 | 优缺点 | 外观模式对比 | 适配器模式相关角色 | 类适配器 | 对象适配器 | 实现流程 )

2023-06-13 09:17:42 时间

文章目录

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 . 用户访问操作 :

① 定义目标接口变量 : 定义 用户目标接口 对象变量 ;

② 目标接口变量赋值 : 创建 适配器对象 赋值给上述 用户目标接口对象变量 , ( 适配器 是 用户目标接口 的子类 ) ;

③ 目标接口调用 : 调用用户目标接口 , 即可调用被适配者的实际功能方法 ;