适配器模式

适配器模式

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

例如: InputStreamReader(InputStream); 可以将字节流转为字符流, 这里就用到了适配器模式

这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

角色分析

  • 目标接口: 客户所期待的接口, 目标可以是具体的或抽象类, 也可以是接口
  • 需要适配的类: 需要适配的类或适配的类
  • 适配器: 通过包装一个需要适配的对象, 把原接口转化成目标对象

案例

思考

如果我们有一台老电脑, 没有网线插槽, 只有USB的插槽, 这时候我们就需要使用一个网线适配器来让电脑可以使用网线上网

现在我们就用代码来模拟一下这个适配器

代码

Adaptee类: 要被适配的类->网线

public class Adaptee {
    // 上网
    public void request() {
        System.out.println("连接网线上网");
    }
}

NetToUsb类: 接口转换器的抽象实现

public interface NetToUsb {
    // 作用: 处理请求, 网线=>USB
    public void handleRquest();
}

Adapter类: 真正的适配器, 需要连接USB, 连接网线

public class Adapter implements NetToUsb {

    // 组合网线
    private Adaptee adaptee;

    // 构造器
    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }
    
    // 使用适配器连接网络
    @Override
    public void handleRquest( ) {
        adaptee.request(); // 可以上网了
    }
}

Computer类: 电脑类->想上网, 插不上网线

public class Computer {
    // 我们的电脑需要连接上转接器才可以上网
    public void net(NetToUsb adapter) {
        // 上网的具体实现, 找一个转接头
        adapter.handleRquest();;
    }
}

main 方法实现

public static void main(String[] args) {
    Computer computer = new Computer(); // 电脑
    Adaptee adaptee = new Adaptee(); // 网线
    Adapter2 adapter = new Adapter2(adaptee); // 转接器

    computer.net(adapter);
}

输出结果:

连接网线上网

代码结构图:

优缺点

优点

  • 一个对象适配器可以把多个不同的适配者适配到同一个目标
  • 可以适配一个适配者的子类,由于适配器和适配者之间是关联关系,根据“里氏代换原则”,适配者的子类也可通过该适配器进行适配。

缺点

  • 对于Java、C#等不支持多重类继承的语言,一次最多只能适配一个适配者类,不能同时适配多个适配者;
  • 在Java、C#等语言中,类适配器模式中的目标抽象类只能为接口,不能为类,其使用有一定的局限性

适用场景

  • 系统需要使用一些现有的类,而这些类的接口(如方法名)不符合系统的需要,甚至没有这些类的源代码。
  • 想创建一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
原文地址:https://www.cnblogs.com/zpKang/p/13124272.html