概述
适配器模式,属于结构型设计模式之一,其核心思想是将一个接口转换成客户希望的另一个接口,使得原本不兼容的接口可以协同工作。这种模式在需要使用现有类,但其接口不符合需求时特别有用。通过适配器,我们可以创建一个包装类,该类持有被适配对象的引用,并提供客户所期待的接口。
目的
兼容性:让原本不兼容的类可以一起工作。
复用性:无需修改原有代码,就可以通过适配器来重用现有的类。
灵活性:提升系统的灵活性和可扩展性,使得系统更易于维护和升级。
类型
适配器模式主要有两种形式:
对象适配器(Object Adapter):通过继承来实现。在这种方式下,适配器类会继承自被适配类,并实现目标接口。
类适配器(Class Adapter):通过组合来实现。适配器类持有一个被适配类的实例,然后通过委托调用被适配类的方法。这是Java等不支持多重继承的语言中常用的方式。
结构
目标接口(Target Interface):客户所期待的接口,适配器类需要符合这个接口。
适配者类(Adaptee Class):已经存在的、需要适配的类或接口。
适配器类(Adapter Class):包装被适配类的实例,同时实现目标接口,使它能够被客户端以目标接口的形式使用。
实现步骤
定义目标接口:确定客户端需要的接口。
分析并识别需要适配的类:找到现有的类或接口,它们不能直接满足客户端的需求。
创建适配器类:根据需要选择对象适配器或类适配器的方式来实现适配器。适配器内部包含对被适配类的引用,并实现目标接口。
客户端调用:客户端通过目标接口与适配器交互,无需了解适配器内部的具体实现,也不直接与适配者类交互。
适用场景
当你想使用一个已经存在的类,而它的接口不符合你的需求时。
你想创建一个可重用的类,用于与一些彼此不相关的类一起工作,而这些类之间并无共同的接口。
需要使用一些旧的系统或者第三方库中的类,但它们的接口不符合新系统的要求。
优点:
提高了系统的灵活性和可扩展性。
符合“开闭原则”,即对扩展开放,对修改关闭。
增加了类的透明性和复用性。
缺点:
过多的使用适配器,可能会导致系统结构复杂化,增加理解难度。
适配器模式主要解决接口不兼容的问题,如果可以通过修改源码来直接适应则更为简单直接。
示例代码
目标接口
public interface Target {
void request();
}
适配者类
public class Adaptee {
public void specificRequest() {
System.out.println("Adaptee specific request.");
}
}
适配器类(对象适配器)
public class ObjectAdapter implements Target {
private Adaptee adaptee;
public ObjectAdapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.specificRequest();
}
}
客户端代码
public class Client {
public static void main(String[ ] args) {
Adaptee adaptee = new Adaptee();
Target target = new ObjectAdapter(adaptee);
target.request(); // 输出: Adaptee specific request.
}
}
通过上述示例,可以看到适配器模式如何使得原本不兼容的Adaptee
类能够通过ObjectAdapter
以Target
接口的形式被客户端使用,增加了系统的灵活性和可维护性。
评论区