生活中的一些例子

在我们的日常生活中,对于适配器,可以说是无处不在。例如我们平时使用的笔记本电脑,可能笔记本电脑的工作电压是20V,但我们一般的家庭用电是220V,这时候电脑在充电的时候就需要一个电源适配器来把220V的电脑转化为20V的电压了。这个电源适配器也别称为充电器或变压器。

又如,我们想用苹果的充电线给安卓的手机充电时。由于两者的接口不一样,会导致充电口无法匹配。这时,我们就需要适配器,将安卓的充电接口转化为苹果的接口,这样,就可以进行充电了。

上面说的两个例子,就是今天我们要讲的适配器模式。

适配器模定义

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

在适配器模式中,存在两种不同的模式结构:类的适配器模式和对象的适配器模式

对象的适配器模式

我们以上面的苹果充电线给安卓手机充电的为例,如果是你来写代码,把他们进行兼容适配,你会怎么写呢?

对于这个问题,我们首先先来看一下适配器模式中涉及到的三个角色:

1、Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。例如对于上面的第二个例子,客户端的目标是要给只接受安卓充电口的安卓手机充电,所以我们的目标抽象类就是安卓充电线的接口。

2、Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法。例如上面苹果充电线就是适配者类。

3、Adapter(适配器类):通过包装一个需要适配的对象,把原接口转换成目标接口。例如为了可以充电,我们需要一个适配器,使之一边可以连接安卓充电的接口,一边可以连接苹果充电线的接口。

UML图

下面我们用代码来做个实例:

(1).Target类

public class Android {

public void isAndroid(){

System.out.println("这是一个只接受安卓充电线的插口");

}

}

(2).Adaptee类

public class Iphone {

public void isIphone(){

System.out.println("这是一个适配苹果充电线的插口");

}

}

(3).Adapter类:把他们进行适配

/**

* 适配器,作为中间件,把他们进行适配

*/

public class Adapter extends Android{

private Iphone iphone;

public Adapter(Iphone iphone){

this.iphone = iphone;

}

@Override

public void isAndroid() {

iphone.isIphone();

}

}

(4).测试类

public class Demo {

public static void main(String[] args){

Android android = new Adapter(new Iphone());

//调用的是安卓的接口,但实际上

//确实一个可以接受苹果充电器的接口

android.isAndroid();

}

}

(5).打印结果

这是一个适配苹果充电线的插口

我们通过适配器的作用,就可以让苹果充电线给安卓手机充电了。。

对于这种对象的适配器模式,实际上就是通过一个适配器类,把目标类和需要被适配的类进行组合。所以适配器类Adapter一般需要继承或实现Targert,并且还得持有Adaptee的实例引用。

类的适配器模式

除了对象的适配器模式,还有另外一种类的适配器模式。在这种模式中,Adapter不持有Adaptee的实例引用,而是直接继承Adaptee类,然后再实现Target接口。或者直接继承Adaptee类和Target类,但由于Java中不支持多重继承,所以只能用实现Target的方式。

这也导致了在Jaca类的适配器模式中,Target必须是一个接口而不可以是抽象类和具体类(因为Java不支持多重继承)。

把上面那个例子改写一下,用类的适配器模式来实现:

(1).Target接口类

interface Android {

void isAndroid();

}

(2).Adaptee类

public class Iphone {

public void isIphone(){

System.out.println("这是一个适配苹果充电线的接口");

}

}

(3).Adapter类:继承Adaptee,实现Target

/**

* 适配器,把安卓手机的插口转化为可以用苹果充电线充电的接口

*/

public class Adapter extends Iphone implements Android{

@Override

public void isAndroid() {

//直接调用

isIphone();

}

}

(4).测试类

public class Demo {

public static void main(String[] args){

Android android = new Adapter();

android.isAndroid();

}

}

(5).打印结果

这是一个适配苹果充电线的接口

对于这种类的适配器模式,在Java中是使用的比较少的。

这两种方式最重要的区别就是:

对象适配器模式通过组合来实现适配器功能,而类的适配器模式通过多继承或实现来实现适配器功能。

适配器模式的一些优缺点

感觉,优缺点没什么好说的,只有实际上去用过才能体会。反正最重要的优点就是将不兼容的几个接口通过一个中间类,把他们进行适配,并且这个适配的过程对于客户端来说是透明的,客户端并不知道发生了啥,只知道它通过一个适配器,就可以获取到目标接口了。

至于缺点嘛,如果动不动就使用适配器,那么我觉得会使整个类系统变的有点零散,并且以后要重构了会更加复杂……

关注公我的众号:苦逼的码农,获取更多原创文章,后台回复礼包送你一份时下热门的资源大礼包。同时也感谢把文章介绍给更多需要的人

c语言非标准输出电源适配器,五分钟了解设计模式(3)---适配器模式相关推荐

  1. 语言列表导出xlxs_学习五分钟,掌握一种新语言。

    有没有一种语言,既实用还能够短时间内学会并应用起来?当然有.小阳今天要教给大家的是一种标记语言--Markdown. 经常上网的你,一定有注意到很多网页排版整齐.简洁优美,各级标题区分明显,文章逻辑清 ...

  2. c语言实现java接口_五分钟带你了解Java是如何从容而优雅地实现接口数据校验

    本篇文章给大家分享平时开发中总结的一点小技巧!在工作中写过Java程序的朋友都知道,目前使用Java开发服务最主流的方式就是通过Spring MVC定义一个Controller层接口,并将接口请求或返 ...

  3. 语言叮叮消息接口_五分钟学后端技术:如何学习Java工程师必知必会的消息队列...

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 什么是消息队列 "RabbitMQ?""Kafka?""RocketMQ?" ...

  4. linux捕获标准输出电源适配器厂家,电源适配器基础知识

    原标题:电源适配器基础知识 脉宽调制 电源适配器中常用的一种调制控制方式.脉冲宽度调制是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变, ...

  5. python创建一个标准输出电源适配器_Python可编程红外USB适配器

    pIRkey为任何计算机,笔记本电脑,平板电脑添加了一个红外遥控接收器......任何带有可以使用键盘的USB端口的计算机或设备. 这个小板滑入任何USB A端口,并显示为每日USB键盘. 板载ATS ...

  6. 五分钟精通设计模式(一)--速记23种设计模式

    本文由程序员伟哥原创,若需要转载,请注明出处. 通过我杜撰的一个新白娘子传奇故事帮助大家记忆23种设计模式 三类设计模式: 三类设计模式可以这么记: 一.白素贞闯入人满为患的大街上(闯街--创建) 刚 ...

  7. 五分钟了解设计模式六大原则(上)

    目录 简介 设计模式是什么? 设计模式六大原则是什么? 设计模式有哪些? 单一职责原则(Single Responsibility Principle) 我们应该如何使用单一职责呢? 里氏替换原则(L ...

  8. java的适配器的情形_Java设计模式之适配器模式(Adapter)

    [导读]通常,在代码已经存在的情况下编写客户端代码(客户端就是需要调用我们代码的对象),开发人员可以采取模拟客户端的方式调用我们提供的接口对象. 通常,在代码已经存在的情况下编写客户端代码(客户端就是 ...

  9. 设计模式Adapter模式的五分钟

    五分钟一个设计模式.来形容叙述的设计模式的最简单方法.看到许多其他设计模式,请点击五分钟一个设计模式系列 http://blog.csdn.net/daguanjia11/article/catego ...

  10. c++ stack 遍历_五分钟C语言数据结构 之 二叉树后序遍历(非递归很重要)

    五分钟C语言实现常见数据结构 今天的内容分享的是二叉树后序遍历 DP问题,欢迎关注 动态规划一篇就够了 全网最详细, 逐步理解, 万字总结 - Johngo的文章 - 知乎 https://zhuan ...

最新文章

  1. SQL Server CE學習篇
  2. winform 程序制作自己的数字签名(续)
  3. duilib设置滚动条自动滚动到底
  4. linux系统C语言学习总结
  5. 25个优秀的设计机构网站设计案例
  6. 雷军公布小米高管团队:仅15位,常程位列其中
  7. lisp新建标注式样_[求助]请教一下,如何编定义标注样式的LSP?
  8. 中国联通最快明年实现2G全面退网;苹果发布iOS 14.3后火速撤回:原因未知;Angular 11.0.0 正式发布|极客头条
  9. [转]编程之美数组分割问题
  10. 第4次作业类测试代码+105032014065+方绎杰
  11. [bzoj3670] [NOI2014] [lg2375] 动物园
  12. .NET软件授权管理解决方案Eziriz .NET IntelliLock
  13. 蚌埠计算机学校招生,蚌埠高级技工学校招生政策
  14. 使用VS2017和Qt编译OpenCV
  15. Flink流处理框架下的交通灯控制器
  16. Tesseract-OCR5.0软件安装和语言包安装(Windows系统)
  17. 如何控制cpu资源使用?
  18. vue通过子组件修改父组件prop的几种实现方式
  19. 那些你可能不知道的微信奇技淫巧
  20. android高德地图定位是准确的吗,高德地图定位不准确?原因在这里!

热门文章

  1. Linux中ssh远程登录服务、SSH免密登录
  2. oracle 进入empt,关于redhat6.2静默安装oracle11g出现的问题 大神救命
  3. centos 修改root密码_Liunx 下安装数据库以及修改密码
  4. centos7 python2升级为python3,并且重新配置yum
  5. oracle增量备份level0,Oracle备份类型level0、level1,增量、差异备份
  6. Sping AOP概述
  7. ngrok技术原理及下载使用
  8. Dokcer从理论到实践----------Docker原理
  9. linux 为动态分配的Virtualbox虚拟硬盘扩容
  10. Angular2.x