适配器模式(Adapter)
将一个类的接口转化为另一需要的接口形式。
在GoF23种设计模式中,属于结构型模式( Structural patterns)
。
该种模式一般是在项目维护迭代中使用,用于新功能与老代码的复用中使用,在项目开始设计中不要考虑该种模式。
-
优点
- 提高代码复用率
- 简单灵活高效
-
缺点
- 增加了系统的复杂性
- 较多的使用,会使系统难以维护
-
两种形式
- 类适配器
- 对象适配器
类适配器可以通过继承待适配的类,不用额外的对象引用。对象适配器需要引入待适配的对象,好处是不用继承,代码简单易懂。
实现
简而言之,待适配对象经过适配器被适配成目标对象,被客户端调用。
角色说明
- Target(目标对象)
- 需要的目标接口
- Adaptee(待适配的对象)
- 待被适配成target对象的实现类
- Adapter(适配器)
- 适配器
- Client(客户端)
- 调用类
类适配器
类适配器代码实现
- Target.java
public interface Target {
void request();
}
- Adaptee.java
public class Adaptee {
public void specificRequest(){
System.out.println("待适配类方法");
}
}
- Adapter.java
public class Adapter extends Adaptee implements Target{
@Override
public void request() {
System.out.println("开始适配");
super.specificRequest();
System.out.println("适配结束");
}
}
- Client.java
public class Client {
public static void main(String[] args) {
Target adapter = new Adapter();
adapter.request();
}
}
- output
开始适配
待适配类方法
适配结束
对象适配器
对象适配器代码实现
- Adapter.java
public class Adapter implements Target {
private Adaptee adaptee = new Adaptee();
@Override
public void request() {
System.out.println("开始适配");
adaptee.specificRequest();
System.out.println("适配结束");
}
}
该实现方式与类适配器唯一不同之处在于,Adaper的实现,故上面仅列出了Adaper的代码。
实例
SpringAop中的AdvisorAdapter为例。
角色说明
- AdvisorAdapter(Target)
- AfterReturningAdviceAdapter(adapter)
- AfterReturningAdviceInterceptor (Adaptee)
总结
如果待适配的对象是个接口,那么选择类适配器更好。
如果待适配的对象是个类,那么选择对象适配器更优。
总之,适配器模式是为了复用原来代码,提高代码利用率而采用的,在工程设计之初请不要考虑该模式。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名,转载请标明出处
最后编辑时间为:
2019-12-12