设计模式 - 适配器模式

152 阅读5分钟

设计模式 - 适配器模式

一、引入

适配器模式就好比是一个插头转换器,它帮助我们解决不兼容的问题。在软件开发中,有时候我们需要将一个对象或接口的行为适应另一个对象或接口,而适配器模式就是用来完成这个任务的。

举个例子,假设你有一个充电器,它只能插在圆孔的插座上,但你的家里只有方孔的插座。这时,你需要一个插座适配器,它可以将方孔插座变成圆孔插座,这样你的充电器就能正常使用了。

在软件中,适配器模式也是类似的,它帮助我们将一个接口或类的行为适应另一个接口或类,使它们能够一起工作,而不需要修改它们的源代码。这种模式在集成新功能或库时非常有用,因为它可以让不同的部分协同工作而互不干扰。

总的来说,适配器模式就是为了解决不兼容的问题,让不同的部分能够一起工作,就像插头转换器帮助你的充电器在不同类型的插座上使用一样。

二、概念

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端所期待的另一个接口,从而使得原本不兼容的类可以一起工作。

三、基本结构

  1. 目标接口(Target):客户端所期待的接口,它定义了客户端所使用的方法或属性。
  2. 适配器(Adapter):它实现了目标接口,并包含了一个对被适配对象的引用。适配器将客户端的请求委派给被适配对象。
  3. 被适配对象(Adaptee):它是需要被适配的对象,拥有客户端所需的方法或属性,但其接口与目标接口不兼容。
  4. 客户端(Client):使用目标接口的对象。

适配器模式有两种实现方式:类适配器和对象适配器。

  • 类适配器:通过继承被适配类来实现适配器。
  • 对象适配器:通过在适配器中持有一个被适配对象的实例来实现适配器。

四、示例代码

/**
 * 被适配对象
 */
public class Adaptee {
    public void specificRequest() {
        System.out.println("被适配的对象");
    }
}
/**
 * 目标接口
 */
public interface Target {
    void request();
}

1、对象适配器

/**
 * 对象适配器
 */
public class ObjectAdapter implements Target {
    private Adaptee adaptee;

    public ObjectAdapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void request() {
        //被适配的返回
        adaptee.specificRequest();
        //添加新的数据信息
        System.out.println("适配后的数据信息");
    }
}

2、类适配器

/**
 * 类适配器
 */
public class ClassAdapter extends Adaptee implements Target {
    @Override
    public void request() {
        //被适配的返回
        specificRequest();
        //添加新的数据信息
        System.out.println("适配后的数据信息");
    }
}
/**
* 客户端
*/
public class Client {
    public static void main(String[] args) {
        System.out.println("类适配器");
        ClassAdapter classAdapter = new ClassAdapter();
        classAdapter.request();

        System.out.println("==================");

        System.out.println("对象适配器");
        Adaptee adaptee = new Adaptee();
        ObjectAdapter objectAdapter = new ObjectAdapter(adaptee);
        objectAdapter.request();
    }
}

五、用途

  1. 接口不兼容:当现有的接口与需要的接口不匹配时,可以使用适配器模式来使它们能够协同工作。
  2. 类库的适配:当使用一个新的类库或服务时,可以使用适配器来使现有的代码与之兼容,而不需要修改现有的代码。
  3. 复用旧代码:可以使用适配器来重用旧的类或代码,使其与新的代码协同工作。
  4. 实现多接口:有时一个类需要实现多个接口,但这可能导致代码的复杂性,可以使用适配器来实现其中一个接口,从而简化代码结构。

适配器模式在许多领域都有应用,比如:

  • Java I/O 流:Java 中的 InputStreamOutputStream 就是通过适配器模式来实现对不同数据源的读写操作的。
  • Spring MVC 的 HandlerAdapter:Spring MVC 中的 HandlerAdapter 就是一个适配器,它将请求转发给不同类型的 Controller 处理。

六、总结

优点:

  1. 解决接口不兼容问题:适配器模式可以帮助解决两个接口之间不兼容的问题,使它们能够协同工作。
  2. 复用旧代码:适配器模式可以重用现有的类或代码,使其与新的代码协同工作,而不需要修改现有的代码。
  3. 降低耦合度:适配器模式可以降低不同模块之间的耦合度,使系统更加灵活和易于维护。
  4. 符合开闭原则:适配器模式可以在不修改现有代码的情况下引入新的功能,符合开闭原则。

缺点:

  1. 增加了类和对象的数量:引入适配器模式会增加额外的类和对象,可能会增加系统的复杂性。
  2. 可能引入性能损失:在适配器模式中,需要进行额外的转换或处理,可能会导致性能损失。
  3. 可能引入设计混乱:如果过度使用适配器模式,可能会导致系统的设计变得混乱不清。

总的来说,适配器模式是一种在解决接口不兼容的情况下非常有用的设计模式,它可以帮助不同类或模块协同工作,提高系统的灵活性和扩展性。然而,在使用时需要权衡利弊,避免过度使用,保持代码的清晰和简洁。