本文首发于cdream的个人博客,点击获得更好的阅读体验!

欢迎转载,转载请注明出处。

本文简述适配器模式,考虑到java中没有多继承就只写了对象适配器模式,然后例子是怎么用转接口把3.5mm耳机插在小米8上面。

一、概念

适配器模式(英语:adapter pattern)有时候也称包装样式或者包装(wrapper)。将一个类的接口转接成用户所期待的。一个适配器使得因接口不兼容而不能在一起工作的类能在一起工作,做法是将类自己的接口包裹在一个已存在的类中。

适配器模式允许一个已存在的类的接口被用作另一个接口。通常可以在不需要修改源代码的情况下使用已存在的类。

其实在生活中,适配器随处看见,例如下图,一个type-c转耳机口的适配器。接下来让我看看适配器模式的结构,并用java代码来实现一个type-c接口的手机与3.5mm的耳机通过适配器连接。

适配器模式主要解决两个问题
1.转换当前接口为客户端需要的接口
2.通过适配器使用没有我们需要的接口的类

描述看似相同,实际上出发点不同~嘿嘿,意会意会

二、结构

适配器模式有两种,一种是类适配器,不过需要支持多继承的语言才能实现,本文主要讲解单继承也可以实现的对象适配器。下图是对象适配器模式的类图,Client需要一个实现Target接口的类来完成工作,而当前我们提供的只有Adaptee类,这时该怎么办呢?恩,我们就造一个适配器(adapter)来完成这个需求。

涉及到的主要角色:

Target:目标接口,也就是我们期待得到的接口。

Adaptee:当前拥有的接口,需要适配,已满足客户端的要求。

Adapter:适配器类,适配器模式的核心,就是将Adaptee转换成需要的接口的具体类。

三、Type-C转3.5mm耳机孔适配器

这个是小米8手机类,只提供插TypeC耳机的接口

public class Mi8{
private TypeCEraPhones eraPhones;
//打电话功能
public void call() {
System.out.println("打电话");
}
//播放音乐,有耳机就用耳机,没耳机就外放
public void playMusic() {
if (eraPhones != null){
eraPhones.play();
}else{
System.out.println("外放");
} }
// 插个TypeC接口的耳机
public void setEraPhones(TypeCEraPhones eraPhones) {
this.eraPhones = eraPhones;
}
}

这个是TypeC接口的耳机接口,听说用这个接口的耳机都好好贵呢~~

public interface TypeCEraPhones {
void play();
}

这个是我们以前剩下的能听个响的3.5mm接口的耳机

public class Mi35MMEraPhones {
public void play(){
System.out.println("使用3.5mm孔的小米耳机播放声音");
}
}

怎么办呢,是花大钱买个新的耳机(想想,如果真是个复杂的对象,重新实现功能是不是很头大),还是对当前这个3.5mm的耳机爆改,可是我还有个需要使用3.5mm的mp3 ,

设计模式——适配器模式(type-c转3.5mm耳机口)的更多相关文章

  1. 20. 星际争霸之php设计模式--适配器模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  2. Java设计模式——适配器模式

    JAVA 设计模式 适配器模式 用途 适配器模式 (Adapter) 将一个类的接口转换成客户希望的另外一个接口. Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适配器 ...

  3. linkin大话设计模式--适配器模式

    linkin大话设计模式--适配器模式 大家知道,在java中只允许单继承,但是在实际问题中往往都需要多继承,java引入了接口这一概念.(一个类可以实现多个接口) 由于接口中都是抽象方法,那么我们在 ...

  4. 手机遥控器,3.5mm耳机接口红外遥控改造解析

    很多家电都用红外遥控,如电视机.机顶盒.空调.电风扇等.越来越多的遥控器反而给我们带来了更多的问题,有时找不到遥控器放哪儿了,或者混淆了都是麻烦,事实上对手机进行简单的改造,可以自制一个万能红外遥控器 ...

  5. php设计模式适配器模式

    php设计模式适配器模式 简介 适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的.一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起. 其实就是通过一个转换类,这个转 ...

  6. 【设计模式】Java设计模式 - 适配器模式

    [设计模式]Java设计模式 - 适配器模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一 ...

  7. 结合JDK源码看设计模式——适配器模式

    定义: 将一个类的接口转换成客户期望的另外一个接口(重点理解适配的这两个字),使得接口不兼容的类可以一起工作适用场景: 已经存在的类,它的方法和需求不匹配的时候 在软件维护阶段考虑的设计模式 详解 首 ...

  8. 设计模式-适配器模式(Go语言描写叙述)

    在上一篇博客设计模式-策略模式(Go语言描写叙述)中我们用最简单的代码用go语言描写叙述了设计模式中的策略模式,用最简单的实例来描写叙述相信能够让刚開始学习的人能够非常轻松的掌握各种设计模式.继上篇博 ...

  9. 浅谈Python设计模式 - 适配器模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 从本篇便开始介绍结构型设计模式,而适配器设计模式便是该类设计模式的一种,那么什么 ...

随机推荐

  1. wpf Listbox 实现按住ctrl键来取消选中

    1. 首先继承一个listbox,来获得按住ctrl键时,点击的item public class ListBoxEx : ListBox { public BeatTemplateWave GetA ...

  2. ModelValidator基于元数据的验证

    ModelValidator主要是应用在ModelMetadata元数据的类型上或类型属性上.它是验证的基础类型,所有的ModelValidatorProviders.DataAnnotationVa ...

  3. poj1029 False coin

    http://poj.org/problem?id=1029 题目大意:“金条”银行从可靠的消息来源得知,在他们最后一组N个硬币中,一枚硬币是假的,与其他硬币的重量不同(其他硬币的重量相等).在经济危 ...

  4. 【TensorFlow】:解决TensorFlow的ImportError: DLL load failed: 动态链接库(DLL)初始化例程失败

    [背景] 在scikit-learn基础上系统结合数学和编程的角度学习了机器学习后(我的github:https://github.com/wwcom614/machine-learning),意犹未 ...

  5. CSS3盒子模型(上)

    CSS的盒子模型分为三个大模块: 盒子模型 . 浮动 . 定位,其余的都是细节.要求这三部分,只要是学前端的无论如何也要学的非常精通. 所谓盒子模型就是把HTML页面中的元素看作是一个矩形的盒子,也就 ...

  6. Mac 安装mongodb

    http://blog.csdn.net/u010311313/article/details/46948995 1.前往官网下载MongoDB压缩包 2.将下载好的压缩包解压,将解压出的文件夹下的内 ...

  7. Java零基础教程(二)基础语法

    Java 基础语法 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如 ...

  8. JAVA动态代理和方法拦截(使用CGLib实现AOP、方法拦截、委托)

    AOP用CGLib更简便.更可控. 动态代理的实现非常优雅. 实体类: public class SampleClass { public String MyFunction1(String inpu ...

  9. opencv2.4.13.7的resize函数使用(c++)

    先来看一下resize函数的原型,如下. C++: void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, doub ...

  10. centos7 python2和python3共存

    一.解决Python2 pip问题 在centos7中安装好操作系统,自带的是Python2的版本,但是并没有pip的方法,我们需要自行安装 报名为python-pip # 默认python2的版本 ...