07-适配器模式
1.类适配器-基于继承
// 对外接口
public interface ITarget {
void f1();
void f2();
}
// 内部接口
public class Adaptee {
public void fa() {
System.out.println("fa");
}
public void fb() {
System.out.println("fb");
}
}
// 类适配器Adaptor将内部接口(Adaptee中接口)转换为了对外接口(ITarget)。
public class Adaptor extends Adaptee implements ITarget {
@Override
public void f1() {
super.fa();
}
@Override
public void f2() {
super.fb();
}
}
2.对象适配器-基于组合
// 对外接口
public interface ITarget {
void f1();
void f2();
}
// 内部接口
public class Adaptee {
public void fa() {
System.out.println("fa");
}
public void fb() {
System.out.println("fb");
}
}
public class Adaptor implements ITarget {
private final Adaptee adaptee;
public Adaptor(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void f1() {
adaptee.fa();
}
@Override
public void f2() {
adaptee.fb();
}
}
3.适配器模式总结
- 类适配器和对象适配器的使用场景。
- 如果Adaptee接口并不多,使用类适配器和对象适配器都可以。
- 如果Adaptee接口较多,但是Adaptee和ITarget接口定义基本都是相同的,即只有一小部分接口需要通过适配器模式进行转换,大部分接口直接使用,则推荐使用类适配器,这样代码量较少。
- 如果Adaptee接口较多,但是Adaptee和ITarget接口定义不部分都是不相同的,推荐使用对象适配器,这样更加的灵活。
- 适配器模式使用的场景:封装有缺陷的接口设计、统一多个类的接口设计、替换依赖的外部系统、兼容老版本接口和适配不同格式的数据。
4.Wrapper设计模式
- 从代码结构上看,静态代理模式、装饰器模式和适配器模式的代码接口是非常相似的,这三种设计模式可以被统称为Wrapper设计模式。
- Wrapper设计模式的用途。代理模式为类增加不相关的功能;装饰器模式为类增加相关的功能;适配器模式处理接口不兼容的问题。