适配器模式:
掌握适配器模式的应用场景
重构第三方登录自由适配的业务场景
instanceof?
适配器模式:Adapter Pattern
又叫变压器模式,他的功能是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配导致无法在一起工作的两个类能够在一起工作
属于结构型设计模式
在软件开发中,基本上任何问题都可以通过增加一个中间层进行解决。
适配器其实就是一个 中间层
综上,适配器模式 其实起着 转化/委托的作用,将一种接口转化为另一种符合需求的接口
提供一个转换器(适配器),将当前系统存在的一个对象转化为客户端能够访问的接口对象。
主要用于处理兼容性问题:
类适配器
接口适配器
对象适配器
应用场景:
1、已经存在的类,他的方法和需求不匹配(方法结果相同或相似)的情况
2、适配器模式 不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品、不同厂家造成功能类似二接口不相同情况下的解决方案。
生活中:
电源插砖头
手机充电转换头
显示器转接头
适配器模式一般包含三种角色:
目标角色(Target): 也就是我们期望的接口
源角色(Adaptee): 存在系统中,内容满足客户需求(需转换),但接口不匹配的接口实例
适配器(Adapter): 将 源角色(Adaptee)转化为 目标角色(Target) 的类实例
适配器模式有3种形式:类适配器、对象适配器、接口适配器
类适配器:
类适配器 的原理是通过继承来实现适配器的功能
Adapter 实现 Target 接口适配器,且继承 Adaptee ,这样 Adapter 就具备 Target 和 Adaptee 的特性,就可以将两者进行转化
通用写法:
pattern.adapter.general.classadapter
业务实例:
中国民用电都是 220V交流电,但手机使用的锂电池使用的是 5V直流电,因此给手机充电就需求使用电源适配器来进行转换
创建 Adaptee 角色 需要被转的对象 AC220 类,表示220V交流电
创建 Target 角色 DC5 接口,表示手机可以接受的 5V直流电的标准
创建 Adapter 角色 电源适配器 PowerAdapter 类,将220V交流电 转换为 5V直流电
以上,就是通过增加 PowerAdapter 电源适配器,实现了二者的兼容
pattern.adapter.demo.power.classadapter
对象适配器:
对象适配器 的原理是 通过组合来实现适配器功能
Adapter 实现 Target 接口,然后内部持有 Adaptee 实例,然后在 Target 接口规定的方法内转化 Adaptee
通用写法:
pattern.adapter.general.objectadapter
业务实例
pattern.adapter.demo.power.objectadapter
接口适配器:
类适配器、对象适配器 着重于将系统存在的一个角色(Adaptee) 转化成目标接口(Target) 所需的内容
接口适配器 是解决接口方法过多,如果直接实现接口,那么类会多出许多空实现的方法,类显得很臃肿。
接口适配器 能让我们只实现需要的接口方法,目标更清晰
接口适配器 的原理是 利用抽象类实现接口,并且空实现接口其他方法
通用写法:
pattern.adapter.general.interfaceadapter
业务实例
pattern.adapter.demo.power.interfaceadapter
重构第三方登录自由适配的业务场景:
早期的老系统都有自己的用户名密码的登录接口,业务需要支持多种登录方式,如 QQ登录、微信登录、手机登录等
虽然登录形式丰富了,但是登录后的处理逻辑可以不必改变,同样是将登录状态保存到 session ,遵循开闭原则
通用写法:
创建统一的返回结果 ResultMsg 类
存在一个老系统的登录逻辑 PassportService
创建 Target 角色 IPassportForThird 接口
创建适配器 Adapter 角色实现兼容,创建一个新类 PassportForThirdAdapter 继承原来的逻辑,且实现目标角色
adapter.demo.passport.adapterv1
更优写法(策略模式 + 简单工厂 + 适配器模式的综合运用):
根据不同的登录方式,创建不同的 Adapter
首先创建一个 LoginAdapter 接口,
然后创建一个抽象类 AbstraceAdapter 继承 PassportService 原有的功能,同时实现 ILoginAdapter 接口,然后分别实现不同的登录适配器:
QQ登录 LoginForQQAdapter
手机登录 LoginForTelAdapter
然后创建适配器 PassportForThirdAdapter 实现目标接口 IPassprotForThird 完成兼容
pattern.adapter.demo.passport.adapterv2
适配器模式 与 策略模式:
适配器模式 主要解决的是功能兼容问题,
源码中的体现:
Spring: SpringAop 中的 AdvisorAdapter 类,他有三个实现类 MethodBeforeAdviceAdapter、AfterReturningAdviceAdapter、ThrowsAdviceAdapter
SpringMVC: HandlerAdapter 类,他也有多个子类
适配器模式 和 装饰器模式
适配器模式 装饰器模式
形式: 没有层级关系 有层级关系,是一种非常特殊的适配器模式
定义: 通常情况适配器和被适配器没有必然联系 装饰器和被装饰器都实现同一个接口
采用继承或代理的形式进行包装 主要目的是为了拓展之后依然保留的 OOP 关系
关系: 满足 has-a 的关系 满足 is-a 的关系
功能: 注重兼容、转换 注重覆盖、扩展
设计: 后置考虑 前置考虑
适配器模式的优缺点:
优点:
能提供类的透明性和复用,现有的类复用但不需要改变
目标类和适配器类解耦,提高程序的扩展性
在很多业务场景中 符合开闭原则
缺点:
适配器写的过程需要全面考虑,可能会增加系统的复杂性
增加代理阅读难度,降低代码可读性,过多使用适配器会使系统diamante变得凌乱
作业:
1、完善第三方登录接口,完成不修改接口也能实现自动适配的功能。
用装饰器模式套用解决代码修改问题