适配器模式

适配器模式(Adapter Pattern)是一种结构型设计模式,它的主要目的是将一个类的接口转换成客户端所期待的另一种接口形式。这种模式使得原本由于接口不兼容而不能一起工作的类可以协同工作。适配器模式在软件开发中经常被用来使新的接口与老的接口能够一起工作,以利用现有的功能而不影响原有系统的稳定。

实现方式

‌类适配器‌

通过多重继承对一个接口与另外一个接口进行匹配。具体来说,就是创建一个新类,这个新类既继承自需要适配的类(或实现需要适配的接口),又实现了目标接口。这种方式在Java等不支持多重继承的语言中,可以通过实现一个接口并继承一个类(如果需要适配的是类的话,或者通过实现两个接口)来达到目的。但需要注意的是,由于Java的单继承限制,这种方式在某些情况下可能不适用。

‌对象适配器‌

通过组合的方式将不兼容的接口适配。即创建一个新类,这个新类持有一个需要适配的类的实例(或通过构造函数注入,或通过setter方法设置),并实现了目标接口。在这种方式下,适配器类通过调用被适配类的方法来实现目标接口中的方法,从而达到接口转换的目的。

Demo

设计一个打印系统,它期望所有的打印机都实现一个标准的PrintService接口,但是我们手头有一个旧的打印机,它只实现了OldPrinter接口。为了让这个旧打印机能够在新系统中工作,我们需要编写一个适配器。

旧打印机接口

package org.example.adapter;

public interface OldPrint {
    public void print(String document);
}

package org.example.adapter;

public class OldPrintImpl implements OldPrint{
    @Override
    public void print(String document) {
        System.out.println("old print is printing " + document);
    }
}

新打印接口

package org.example.adapter;

public interface PrintService {
    void print(String document);
}

适配器

package org.example.adapter;

public class PrintAdapter implements PrintService{
    private OldPrint oldPrint;

    public PrintAdapter(OldPrint oldPrint) {
        this.oldPrint = oldPrint;
    }

    @Override
    public void print(String document) {
        oldPrint.print(document);
    }
}

测试

package org.example.adapter;

public class AdapterMain {
    public static void main(String[] args) {
        OldPrint oldPrint = new OldPrintImpl();
        PrintAdapter printAdapter = new PrintAdapter(oldPrint);
        printAdapter.print("Hello, Adapter Pattern in Action!");
    }
}

适配器模式_第1张图片

应用场景

  • ‌系统需要使用现有的类,但这些类的接口不符合系统的需要‌。这时可以使用适配器模式将这些类的接口转换成系统所需要的接口。
  • ‌想要使用一个已经存在的类,但它的接口与新系统的接口不兼容‌。通过适配器模式,可以在不改变原有类代码的情况下,使其与新系统兼容。
  • ‌需要与其他系统或组件进行集成,但这些系统或组件的接口不一致‌。适配器模式可以作为一种解决方案,来实现不同系统或组件之间的无缝集成。

优点

  • ‌提高了类的复用性‌:通过适配器模式,可以使原本不兼容的类在一起工作,从而提高了类的复用性。
  • ‌增加了系统的灵活性‌:适配器模式允许系统通过引入适配器来灵活地应对接口变化,而不需要对原有系统进行大量的修改。
  • ‌遵循了开闭原则‌:通过增加适配器类而不是修改原有类来实现接口转换,符合开闭原则的要求(即软件实体应该对扩展开放,对修改关闭)。

缺点

  • ‌增加了系统的复杂性‌:由于引入了适配器类,系统的类数量增加,结构也变得更加复杂。
  • ‌可能导致性能下降‌:适配器类在转换接口时可能会增加一些额外的处理逻辑,这些逻辑可能会导致系统性能的下降(尽管这种影响通常是可以忽略不计的,但在某些性能敏感的场景下可能需要特别注意)。

你可能感兴趣的:(适配器模式,python,java)