设计模式-适配器模式1

简介: 设计模式-适配器模式1


将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

场景分析

比如我们的手机接口,小米6手机只有 type c 接口,同时用于听歌与充电。标准手机接口分别有 3.5mm 耳机接口跟 type c 充电接口。假如现在我们只有 3.5mm 的耳机要在小米6手机上听歌,那个就需要一个适配器 将我们的3.5mm 耳机适配到目标接口 小米6 的 type c,从而实现听歌。

适配器模式在生活中还是很常见的,比如你笔记本上的电源适配器,可以使用在110~220V之间变化的电源,而笔记本还能正常工作,这也是适配器一个良好模式的体现,简单地说,适配器模式就是把一个接口或类转换成其他的接口或类,从另一方面来说,适配器模式也就是一个包装模式,为什么呢?它把Adaptee包装成一个Target接口的类,加了一层衣服,包装成另外一个靓妞了。装饰器模式详情请看历史文章。

UML类图

  • target 目标角色:该角色定义把其他类转换为何种接口,也就是我们的期望接口,例子中就是我们的小米6 type c 接口。
  • Adapter适配器角色:适配器模式的核心角色,其他两个角色都是已经存在的角色,而适配器角色是需要新建立的,它的职责非常简单:把源角色转换为目标角色,怎么转换?通过继承或是持有类引用关联的方式。在例子中就是我们的 type c 接口转换器。
  • Adaptee源角色:你想把谁转换成目标角色,这个“谁”就是源角色,它是已经存在的、运行良好的类或对象,经过适配器角色的包装,它会成为一个崭新、靓丽的角色。在例子中就是我们的 3.5mm 接口的耳机接口。

代码实战

  1. 首先我们先定义好 target 目标角色。也就是我们的小米6 type c 接口。以及手机默认的实现。
/**
 * Project: com-zero-design-stu
 * File created at 2019/6/24 19:45
 */
package com.zero.headfirst.adapter.objects;
/**
 * 通过小米6手机的 type-c 接口听歌,也可以充电(Target 角色)
 * @date 2019/6/24 19:45
 */
public interface XiaoMi6Interface {
    /**
     * 听歌
     */
    void listenMusic();
}

以及小米6 type c 默认功能实现

/**
 * Project: com-zero-design-stu
 * File created at 2019/6/24 20:02
 */
package com.zero.headfirst.adapter.objects;
/**
 * 小米六 type c 接口默认实现功能
 * @date 2019/6/24 20:02
 */
public class XiaoMi6InterfaceImpl implements XiaoMi6Interface {
    @Override
    public void listenMusic() {
        System.out.println("通过 type c 接口的耳机听歌");
    }
}
  1. 定义我们的 Adaptee 角色,也就是我们的 3.5mm 接口的耳机。
package com.zero.headfirst.adapter.objects;
/**
 * 普通手机通用 接口 ,对应的3.5mm 耳机孔
 * @date 2019/6/25 16:28
 */
public interface CommonPhoneInterface {
    /**
     * 听歌
     */
    void listenMusic();
}
public class CommonPhoneImpl implements CommonPhoneInterface {
    @Override
    public void listenMusic() {
        System.out.println("标准手机 3.5 mm 耳机接口听歌");
    }
}
  1. 接着我们定义接口转换器,也就是适配器角色 Adapter。这里我们使用对象适配器方式,也就是适配器持有被适配的引用。同时实现 target 接口。
public class TypeC2HeadphoneAdapter implements XiaoMi6Interface {
    private CommonPhoneInterface commonPhoneInterface;
    public TypeC2HeadphoneAdapter(CommonPhoneInterface commonPhoneInterface) {
        this.commonPhoneInterface = commonPhoneInterface;
    }
    @Override
    public void listenMusic() {
        System.out.println("通过 type c 转 3.5mm适配器将目标 type c 接口适配上3.5mm接口。");
        commonPhoneInterface.listenMusic();
    }
}
  1. 测试
public class Client {
    public static void main(String[] args) {
        //被适配者 3.5毫米耳机
        CommonPhoneInterface headPhone = new CommonPhoneImpl();
        //适配器
        TypeC2HeadphoneAdapter typeC2HeadphoneAdapter = new TypeC2HeadphoneAdapter(headPhone);
        //通过适配器实现了听歌
        typeC2HeadphoneAdapter.listenMusic();
    }
}

打印结果

通过 type c 转 3.5mm适配器将目标 type c 接口适配上3.5mm接口。
标准手机 3.5 mm 耳机接口听歌

总结

当我们的target 角色接口不能修改的情况下,我们的接口要转换适配使用就可以使用适配器模式。

装饰器模式侧重的是同一个接口增强新的功能并且复用。



相关文章
|
7月前
|
设计模式 Java API
重构旧代码的秘诀:用设计模式 - 适配器模式(Adapter)给Java项目带来新生
【4月更文挑战第7天】适配器模式是解决接口不兼容问题的结构型设计模式,通过引入适配器类实现目标接口并持有不兼容类引用,实现旧代码与新接口的协作。适用于处理兼容性问题、整合遗留代码和集成第三方库。应用时,识别不兼容接口,创建适配器类转换方法调用,然后替换原有引用。注意保持适配器简单、使用组合和考虑扩展性。过度使用可能导致系统复杂和维护成本增加,应谨慎使用。
116 4
|
7月前
|
设计模式 Java 中间件
23种设计模式,适配器模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】适配器模式(Adapter Pattern)是一种结构型设计模式,它的主要目标是让原本由于接口不匹配而不能一起工作的类可以一起工作。适配器模式主要有两种形式:类适配器和对象适配器。类适配器模式通过继承来实现适配,而对象适配器模式则通过组合来实现
113 4
|
3天前
|
设计模式 JSON 前端开发
前端必须掌握的设计模式——适配器模式
适配器模式是一种结构型设计模式,用于使接口不兼容的对象能够相互合作。通过在客户端和系统之间引入一个“中间层”适配器,将不同类型的输入数据转换为系统能处理的标准格式,减轻系统的负担,提高扩展性和可维护性。例如,MacBook的扩展坞将多种接口(如HDMI、USB)转换为Type-C接口,实现多接口兼容。
|
3月前
|
设计模式 Java 程序员
Java设计模式-适配器模式(8)
Java设计模式-适配器模式(8)
|
7月前
|
设计模式 Java
【设计模式】JAVA Design Patterns——Adapter(适配器模式)
【设计模式】JAVA Design Patterns——Adapter(适配器模式)
|
2月前
|
设计模式 Java
Java设计模式之适配器模式
这篇文章详细讲解了Java设计模式中的适配器模式,包括其应用场景、实现方式及代码示例。
56 0
|
3月前
|
设计模式 Java
设计模式--适配器模式 Adapter Pattern
这篇文章介绍了适配器模式,包括其基本介绍、工作原理以及类适配器模式、对象适配器模式和接口适配器模式三种实现方式。
|
4月前
|
设计模式 XML 存储
【六】设计模式~~~结构型模式~~~适配器模式(Java)
文章详细介绍了适配器模式(Adapter Pattern),这是一种结构型设计模式,用于将一个类的接口转换成客户期望的另一个接口,使原本不兼容的接口能够一起工作,提高了类的复用性和系统的灵活性。通过对象适配器和类适配器两种实现方式,展示了适配器模式的代码应用,并讨论了其优点、缺点以及适用场景。
|
6月前
|
设计模式
适配器模式-大话设计模式
适配器模式-大话设计模式
|
5月前
|
设计模式 Go 数据处理
iLogtail设计模式问题之在iLogtail中,为何需要使用适配器模式
iLogtail设计模式问题之在iLogtail中,为何需要使用适配器模式