设计模式-适配器模式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 角色接口不能修改的情况下,我们的接口要转换适配使用就可以使用适配器模式。

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



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

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    53
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    37
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    61
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    56
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    40
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    49
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    105
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    75