设计模式之适配器模式

简介: 设计模式之适配器模式

一、介绍

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

这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。

举个例子,现在市面上很多手机都是typeC的接口,但我们的U盘都是usb格式的接口,因此这两个接口是不兼容的,如果我们能在手机上使用usb的U盘,那将会方便很多。因此我们需要一个适配器,适配器的输入端插入U盘,输出端以TypeC的格式插到手机上,这样,手机就可以读取U盘中的文件了。

下面我们使用两种方式来解决这种接口不兼容的问题

  • 不使用设计模式
  • 使用适配器设计模式

二、代码示例

我们以手机和u盘为例,使用两种分别有USB接口和TypeC接口的手机,和两个分别为USB接口和TypeC接口的U盘,下面来看这两个手机如何使用这两个U盘。

1. 新建两种类型的U盘

  • usb类型的U盘

    public interface USB {
         
         
    
        public void work();
    }
    
    @Slf4j
    public class USBDisk implements USB {
         
         
    
        public USBDisk() {
         
         
            log.info("我是usb格式的U盘");
        }
    
        public void work() {
         
         
            log.info("usb格式的u盘正在提供数据服务");
        }
    }
    
  • typeC类型的U盘

    public interface TypeC {
         
         
    
        public void work();
    }
    
    @Slf4j
    public class TypeCDisk implements TypeC {
         
         
    
        public TypeCDisk() {
         
         
            log.info("我是typeC格式的U盘");
        }
    
        public void work() {
         
         
            log.info("typeC格式的u盘正在提供数据服务");
        }
    }
    

2. 新建两种不同类型手机及其对应的实现类

  • usb插槽的手机

    public interface USBPhone {
         
         
    
        public void work(USB usb);
    }
    
    @Slf4j
    public class USBVivo implements USBPhone {
         
         
    
        public USBVivo() {
         
         
            log.info("我是vivo手机,我只提供usb插槽");
        }
    
        @Override
        public void work(USB usb) {
         
         
            usb.work();
        }
    }
    
  • typeC插槽的手机

    public interface TypeCPhone {
         
         
    
        public void work(TypeC typeC);
    }
    
    @Slf4j
    public class TypeCHuaWei implements TypeCPhone {
         
         
    
        public TypeCHuaWei() {
         
         
            log.info("我是华为手机,我只提供typeC插槽");
        }
    
        public void work(TypeC typeC) {
         
         
            typeC.work();
        }
    }
    

3. 运行示例

在手机和U盘相互兼容的情况下,我们可以很简单的就把代码完成。

  • 提供usb插槽的vivo手机使用usb类型的U盘

    public class USBPhoneDemo {
         
         
    
        public static void main(String[] args) {
         
         
            // usb类型的U盘
            USBDisk disk = new USBDisk();
    
            // usb插槽的vivo手机
            USBPhone vivo = new USBVivo();
            // vivo从U盘读取数据
            vivo.work(disk);
        }
    }
    
  • 输出

    输出1.png

  • 提供typeC插槽的华为手机使用typeC类型的U盘

    public class TypeCPhoneDemo {
         
         
    
        public static void main(String[] args) {
         
         
            // typeC类型的U盘
            TypeC disk = new TypeCDisk();
    
            // usb插槽的华为手机
            TypeCPhone huaWei = new TypeCHuaWei();
            // 华为从U盘读取数据
            huaWei.work(disk);
        }
    }
    
  • 输出

    输出2.png

但是在手机插槽和U盘不兼容的情况下,手机是无法通过U盘读取数据的,这时我们需要适配器。

4. 新建适配器类

  • 新建将usb转为typeC的适配器类USB2TypeCAdapter

    因为该适配器输入USB类型的U盘,输出的是typeC的接口,所以本质上是一个TypeC类型的设备

    @Slf4j
    public class USB2TypeCAdapter implements TypeC {
         
         
    
        private final USB disk;
    
        public USB2TypeCAdapter(USB disk) {
         
         
            log.info("适配器正在适配usb类型的U盘与typeC插槽的手机...");
            this.disk = disk;
        }
    
        // 适配器工作时,其实是适配器内的usb在工作
        @Override
        public void work() {
         
         
            disk.work();
        }
    }
    
  • 适配器的应用

    typeC插槽的手机通过适配器读取usb类型的U盘

    public class Usb2TypeCDemo {
         
         
    
        public static void main(String[] args) {
         
         
    
            // usb形式的U盘
            USB usb = new USBDisk(); // 输出:我是usb格式的U盘
    
            // 但我的手机是typeC手机华为,因此我只能接收typeC类型的U盘
            TypeCPhone huawei = new TypeCHuaWei(); // 输出:我是华为手机,我只提供typeC插槽
    
            // 这时我搞一个usb适配器,这个适配器供typeC手机使用,适配器一头连接huawei, 一头连接U盘
            USB2TypeCAdapter usbUSB2TypeCAdapter = new USB2TypeCAdapter(usb); // 输出:适配器正在适配usb与typeC...
    
            // 华为从适配器中读取数据
            huawei.work(usbUSB2TypeCAdapter);    // 输出:usb接口的u盘正在提供数据服务
        }
    }
    
  • 输出

    输出3.png

  • 新建将typeC转为usb的适配器类TypeC2USBAdapter

    因为该适配器输入typeC类型的U盘,输出的是usb的接口,所以本质上是一个usb类型的设备

    public class TypeC2USBAdapter implements USB {
         
         
    
        private final TypeC disk;
    
        public TypeC2USBAdapter(TypeC disk) {
         
         
            log.info("适配器正在适配usb类型的U盘与typeC插槽的手机...");
            this.disk = disk;
        }
    
        @Override
        public void work() {
         
         
            disk.work();
        }
    }
    
  • 适配器的应用

    usb插槽的手机通过适配器读取typeC类型的U盘

    public class TypeC2USBDemo {
         
         
    
        public static void main(String[] args) {
         
         
    
            // typeC形式的U盘
            TypeC typeC = new TypeCDisk(); // 输出:我是typeC格式的U盘
    
            // 但我的手机是usb手机vivo,因此我只能接收usb类型的U盘
            USBPhone vivo = new USBVivo(); // 输出:我是vivo手机,我只提供usb插槽
    
            // 这时我搞一个usb适配器,这个适配器供typeC手机使用,适配器一头连接huawei, 一头连接U盘
            TypeC2USBAdapter typeC2USBAdapter = new TypeC2USBAdapter(typeC); // 输出:适配器正在适配typeC类型的U盘与usb插槽的手机...
    
            // vivo从适配器中读取数据
            vivo.work(typeC2USBAdapter);    // 输出:typeC格式的u盘正在提供数据服务
        }
    }
    
  • 输出

    输出4.png

三、总结

适配器模式本质上就是一个适配器类作为两个不兼容类的桥梁。




纸上得来终觉浅,绝知此事要躬行。

————————我是万万岁,我们下期再见————————

相关文章
|
4月前
|
设计模式 前端开发 Java
【设计模式】【结构型模式】适配器模式(Adpter)
一、入门 什么是适配器模式? 适配器模式是Java中常用的结构型设计模式,它的核心作用就像现实中的电源转换器一样---让原本不兼容的两个接口能够协同工作。 为什么要用适配器模式? 假设我们需要在电商系
119 10
|
8月前
|
设计模式 Java 开发者
「全网最细 + 实战源码案例」设计模式——适配器模式
适配器模式(Adapter Pattern)是一种结构型设计模式,通过引入适配器类将一个类的接口转换为客户端期望的另一个接口,使原本因接口不兼容而无法协作的类能够协同工作。适配器模式分为类适配器和对象适配器两种,前者通过多重继承实现,后者通过组合方式实现,更常用。该模式适用于遗留系统改造、接口转换和第三方库集成等场景,能提高代码复用性和灵活性,但也可能增加代码复杂性和性能开销。
174 28
|
9月前
|
设计模式 JSON 前端开发
前端必须掌握的设计模式——适配器模式
适配器模式是一种结构型设计模式,用于使接口不兼容的对象能够相互合作。通过在客户端和系统之间引入一个“中间层”适配器,将不同类型的输入数据转换为系统能处理的标准格式,减轻系统的负担,提高扩展性和可维护性。例如,MacBook的扩展坞将多种接口(如HDMI、USB)转换为Type-C接口,实现多接口兼容。
|
设计模式 Java
【设计模式】JAVA Design Patterns——Adapter(适配器模式)
【设计模式】JAVA Design Patterns——Adapter(适配器模式)
|
设计模式 Java 程序员
Java设计模式-适配器模式(8)
Java设计模式-适配器模式(8)
|
11月前
|
设计模式 Java
Java设计模式之适配器模式
这篇文章详细讲解了Java设计模式中的适配器模式,包括其应用场景、实现方式及代码示例。
190 0
|
设计模式 XML 存储
【六】设计模式~~~结构型模式~~~适配器模式(Java)
文章详细介绍了适配器模式(Adapter Pattern),这是一种结构型设计模式,用于将一个类的接口转换成客户期望的另一个接口,使原本不兼容的接口能够一起工作,提高了类的复用性和系统的灵活性。通过对象适配器和类适配器两种实现方式,展示了适配器模式的代码应用,并讨论了其优点、缺点以及适用场景。
|
12月前
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
设计模式
适配器模式-大话设计模式
适配器模式-大话设计模式
|
设计模式 Go 数据处理
iLogtail设计模式问题之在iLogtail中,为何需要使用适配器模式
iLogtail设计模式问题之在iLogtail中,为何需要使用适配器模式