适配器模式
定义
适配器模式(Adapter Pattern)又叫做变压器模式,它的功能是将一个类的接口变成客户端所期望的另一种接口,从而使原本因接口不匹配而导致无法工作的类能够一起工作,属于结构型模式。
适用场景
-
已存在类的方法和需求不匹配的情况;
-
适配器模式不是软件设计阶段考虑的设计模式,是后期维护时的方案,解决的是兼容性问题。
通用写法
适配器一般包含三种角色:
-
目标角色(Target):期望的接口;
-
源角色(Adaptee):系统中,内容满足客户需求(需转换),但接口不匹配的接口实例;
-
适配器(Adapter):将源对象转换为目标角色的类实例;
类适配器原理:通过继承来实现适配器功能;具体做法:让Adapter实现Target接口,并且继承Adaptee,这样Adapter就具备Target和Adaptee的特性,就可以将两者进行转化了。
对象适配器——解决类适配器最少知道原则(因为类适配器继承了原对象,所以知道他的所有的方法)
原理:通过组合来实现适配器功能;
具体做法:让Adapter 实现Target接口,然后内部持有Adaptee实例,然后在Target接口规定的方法内转化Adaptee。
注意:类适配器和对象适配器注重原对象方法的适配,如果对象中方法过多则建立使用接口适配器
接口适配器
原理:利用抽象类实现接口,并且空实现接口众多方法。
应用:多场景登录
适配器-多场景登录.png适配器模式优、缺点
优点:
-
提供类的复用,现有类的复用,但无需改变类本身。
-
目标类和适配器类解耦,提供程序的拓展性
-
满足开闭原则
缺点:
-
适配器编写过程需要全面考虑,增加系统复杂性
-
增加代码阅读难度
源码体现
SpringAOP中的AdvisorAdapter类
class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable {
/**
* 判断是否兼容的方法,可作为适配器模式的特征方法
*/
@Override
public boolean supportsAdvice(Advice advice) {
return (advice instanceof MethodBeforeAdvice);
}
@Override
public MethodInterceptor getInterceptor(Advisor advisor) {
MethodBeforeAdvice advice = (MethodBeforeAdvice) advisor.getAdvice();
return new MethodBeforeAdviceInterceptor(advice);
}
}
桥接模式——替代多层继承,强调不同维度的之间的组合
定义
桥接模式(Bridge Pattern)是将抽象部分与它的具体实现部分分离,使它们都可以独立的变化,通过组合的方式建立两个类之间的联系,核心在于解耦抽象和实现,属于结构型模式
适用场景
-
不希望使用继承,或多层继承导致系统类个数剧增;
-
一个类存在两个(或多个)独立变化的维度,而这些维度都需要独立进行扩展;
通用写法
桥接模式.png桥接模式主要包含4种角色:
-
抽象(Abstraction):该类持有一个对实现角色的引用,抽象角色中的方法需要实现角色来实现。抽象角色一般为抽象类(构造函数规定子类要传入一个实现对象);
-
修正抽象(RefinedAbstraction):Abstraction的具体实现,对Abstraction的方法进行完善和扩展;
-
实现(Implement):确定实现维度的基本操作,提供给Abstraction使用。该类一般为接口或抽象类;
-
具体实现(ConcreteImplement):Implement的具体实现。
桥接模式-例子.png
//TODO AbstractCourse补充
源码分析——Driver
桥接模式-Driver.png桥接模式的优缺点
优点:
-
分离抽象部分及其具体实现部分
-
提供系统扩展性
-
符合开闭和合成复用原则
缺点:
-
增加了系统的理解与设计难度
-
需要正确识别系统中多个独立变化的维度;
桥接模式比较.png
作业内容
-
1.完善第三方登录接口,完成不修改接口也能实现自动适配的功能。
-
2.说说你对桥接模式的理解。
网友评论