适配器模式定义
将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类都能够在一起工作。
适配器模式中的三种角色
Target(目标角色)
该角色定义把其他类转换为何种接口,也就是我们期望的接口。通常情况下目标角色是一个接口或者抽象类,一般不会是实现类。
public interface Target {
void request();
}
Adaptee(源角色)
适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码。
public class Adaptee {
public void adapteeRequest() {
System.out.println("被适配者的方法");
}
}
Adapter(适配器类)
适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系。
public class Adapter extends Adaptee implements Target{
@Override
public void request() {
super.adapteeRequest();
}
}
// 客户端代码
public static void main(String[] args) {
Target t = new Adapter();
t.request();
}
适配器模式优点
- 增加了类的透明性
高层访问Target目标,但是具体的实现都委托给了源角色。如果因为业务需要修改具体的实现,高层模块是不受影响的。 - 提高类的复用度
被适配类仍然可以在其他模块中使用。 - 灵活性高
适配器因为继承了源角色类,可以重写其方法,满足业务需求,而不需要修改被适配角色。
适配器模式缺点
因为适配器需要继承被适配者,所以就把唯一继承的机会给用掉了。如果适配器的功能比较复杂,就只能考虑实现多接口,但若是非要继承其他类,就得考虑装饰者模式了。