JAVA 设计模式 适配器
适配器设计模式是一种结构型设计模式,其作用是让原本由于接口不兼容而无法一起工作的类能够协同合作。它就像一个 “转换器”,将一个类的接口转换成客户希望的另一个接口。
适配器模式的结构
适配器模式主要包含以下三个角色:
- 目标接口(Target):客户所期望的接口,目标可以是具体的或抽象的类,也可以是接口。
- 需要适配的类(Adaptee):包含了现有的接口,但是这个接口和目标接口不兼容。
- 适配器(Adapter):能够将 Adaptee 的接口转换成 Target 的接口。
适配器模式的实现方式
适配器模式有两种实现方式,分别是类适配器和对象适配器。下面通过 Java 代码来详细说明这两种实现方式。
类适配器(使用继承)
类适配器使用多重继承来适配两个接口。不过在 Java 里,由于不支持多重继承,类适配器只能通过继承一个类并实现另一个接口来达成。
// 目标接口
interface Target {void request();
}// 需要适配的类
class Adaptee {public void specificRequest() {System.out.println("特殊请求");}
}// 类适配器
class ClassAdapter extends Adaptee implements Target {@Overridepublic void request() {// 调用父类的方法specificRequest();}
}// 客户端代码
public class ClassAdapterClient {public static void main(String[] args) {Target target = new ClassAdapter();target.request(); // 输出: 特殊请求}
}
对象适配器(使用组合)
对象适配器通过组合来实现适配器功能,也就是在适配器类中持有需要适配的类的实例。
// 目标接口
interface Target {void request();
}// 需要适配的类
class Adaptee {public void specificRequest() {System.out.println("特殊请求");}
}// 对象适配器
class ObjectAdapter implements Target {private Adaptee adaptee;public ObjectAdapter(Adaptee adaptee) {this.adaptee = adaptee;}@Overridepublic void request() {adaptee.specificRequest();}
}// 客户端代码
public class ObjectAdapterClient {public static void main(String[] args) {Adaptee adaptee = new Adaptee();Target target = new ObjectAdapter(adaptee);target.request(); // 输出: 特殊请求}
}
适配器模式的适用场景
适配器模式适用于以下几种情况:
- 你想要使用一个已经存在的类,但是它的接口和你的需求不相符。
- 你想创建一个可复用的类,这个类能够和其他不相关的类或者不可预见的类(也就是那些接口不一定兼容的类)协同工作。
- 你需要使用几个已经存在的子类,但是对每个子类进行适配的话不切实际。在这种情况下,你可以使用对象适配器来适配父类的接口。
适配器模式的优缺点
优点:
- 可以让两个没有关联的类一起运行。
- 提高了类的复用性。
- 灵活性和扩展性都非常好,符合开闭原则。
缺点:
- 过多地使用适配器,会让系统变得零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果出现太多这样的情况,会给维护带来困扰。
- 由于 Java 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。