什么是适配器模式?

在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。适配器能将因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。

实现适配器的方式?

①对象适配器模式

-- 在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。

②类适配器模式

-- 这种适配器模式下,适配器继承自已实现的类(一般多重继承)。

理论性的东西看起来就是比较烦,下面来举个日常的小例子来更好的了解适配器吧

图1:三相插头                 图2:二孔插座            图3:三相插头转二相的转换器

      

      

看完上面三幅图,我想大家应该都一目了然了,想把三相插头插到二孔插座里,只能中间加个转换器,这里我们可以简单把它理解成我们今天要说的适配器

再回过头看看文章开始的这句话"适配器能将因为接口不兼容而不能在一起工作的类工作在一起",没错,在两个原本不能工作到一起的组件中间添加适配器,就可以把它们关联起来了。

适配器模式里面存在着3种角色:

1、目标角色(Target):也就是客户理想中想要的接口,比如三相插头,客户想找的插孔就是三孔插座(目标角色)。

2、源(Adatee):现有的接口,也就是不满足客户想要的接口,也就是这个二孔插座(源)。

3、适配器(Adapter):能将二孔插座转换成"三孔插座"的组件,也就是上图的三相插头转二相插头转化器(适配器)。

就以上面的例子,用代码来讲下适配器模式吧

首先先来说下对象适配器模式

以笔记本通电为例,大家都知道正常的笔记本电源是三相接口

ThreeSocket.java

这是一个需求接口,也就是客户期待的,也就是3种角色中的目标接口(Target)

1 packagecom.lcw.adapter.test;2

3 public interfaceThreeSocket {4

5 //需要一个三孔插座,也就是客戶的需求

6 public voidneedThreeSocket();7

8 }

TwoSocket.java

这是现有的组件,也就是那个二孔插座,也就是3种角色中的源(Adatee),虽然能通电,但接口是不满足客户的需要

1 packagecom.lcw.adapter.test;2

3 public classTwoSocket {4 //现有的插座,只有二孔,已经有了供电功能,只是缺少了三孔接口

5 public voidserverTwo() {6 System.out.println("我是一个二孔插座,我有供电功能");7 }8

9 }

ThreeToTwoAdapter.java

这是适配器类,它需要2孔插座来提供电,并实现三孔插座,在构造方法中传入现有组件2孔插座的对象(带电)

1 packagecom.lcw.adapter.test;2

3 public class ThreeToTwoAdapter implementsThreeSocket{4 privateTwoSocket socket;5 publicThreeToTwoAdapter(TwoSocket two) {6 this.socket=two;7 }8 //现在已经有2孔插座的对象(意味着有通电功能)

9 @Override10 public voidneedThreeSocket() {11 socket.serverTwo();12 System.out.println("二孔接口已转换成三孔接口,并注入电");13 }14

15 }

这样一来,适配器类这个中间类就有了源(二孔插座)的效果也就是"电"

然后再实现了目标接口方法,也就是开通了三相接口,把"电"注入,这样就可以把2个本无法一起工作的类聚集到一起,类似红娘在它们之间牵了一条关系线

Computer.java 笔记本类,它需要的是三孔接口

1 packagecom.lcw.adapter.test;2

3 public classComputer {4 //笔记本电脑的电源插头需求是3孔

5 privateThreeSocket three;6 publicComputer(ThreeSocket three){7 this.three=three;8 }9 public voidserver(){10 System.out.println("笔记本通电成功!");11 }12

13 }

来写个测试类

1 packagecom.lcw.adapter.test;2

3 public classTest {4 public static voidmain(String[] args) {5 //现有插座两孔,已经有提供电的功能,只是缺少3孔接口

6 TwoSocket two=newTwoSocket();7 //把具有通电功能的对象传递进去,目的是要开通3孔接口的通电功能

8 ThreeSocket three=newThreeToTwoAdapter(two);9 //得到一个满足笔记本电源接口且具有电的功能对象

10 Computer computer=newComputer(three);11 three.needThreeSocket();12 computer.server();13 }14 }

看下效果图:

好了,这样就把2个原本不能在一起工作的类链接到一起了。

接着来说下类适配器模式

类适配器顾名思义不同点在于适配器,既然突出了'类",我们一般都会联想到继承

嗯,没错,类适配器的做法就是让适配器去继承已有功能(二孔插座)的类,然后再实现期望接口(三孔插座)

具体看代码吧,除了测试类和适配器类,其他的类与上面的保持一致,这里就不再贴出

ThreeToTwoExtendsAdapter.java(适配器类)

1 packagecom.lcw.adapter.test;2

3 public class ThreeToTwoExtendsAdapter extends TwoSocket implementsThreeSocket{4 public voidneedThreeSocket() {5 this.serverTwo();6 System.out.println("二孔接口已转换成三孔接口");7 }8

9 }

Test.java(测试类)

1 packagecom.lcw.adapter.test;2

3 public classTest {4 public static voidmain(String[] args) {5 //由于ThreeToTwoExtendsAdapter继承了源,所以具有源的功能(电),并实现了3孔接口

6 ThreeSocket socket=newThreeToTwoExtendsAdapter();7 //插入接口

8 Computer computer=newComputer(socket);9 socket.needThreeSocket();10 computer.server();11

12 }13 }

效果依旧:

总结下:

①对象适配模式:

把"被适配者"作为一个对象组合到适配器中,以修改目标接口包装被适配者。

(例如上面例子,二孔插座就是被适配者,把对象传入适配器并实现接口方法改造)

②类适配模式:

通过多重继承和实现接口的方式,单一的为某个类而实现适配。

适配器的作用?

1、透明:通过适配器客户端可以调用统一接口,对于客户端是透明的,这样做可以更加简洁, 直接,紧凑。

2、复用:复用了现存的类,解决因环境要求不一致的问题。

3、低耦合:将目标类与源类解耦,引入一个适配器重用源类(适配器类),遵守开放-关闭原则。

作者:Balla_兔子

出处:http://www.cnblogs.com/lichenwei/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我!

java什么是适配器类?作用是什么?_软件设计模式之适配器模式(JAVA)相关推荐

  1. java什么是适配器类?作用是什么?_浅谈Java适配器模式

    假期刚结束不久,也没什么好写的,今天就水下文章,讲讲设计模式对开发时的影响,做开发到现在,感觉设计模式对开发的影响还是挺大的. 这次就简单谈谈适配器模式.可能适配器模式感觉比较鸡肋,但是用到的地方还挺 ...

  2. 软件设计模式之适配器模式(JAVA)

    什么是适配器模式? 在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的.适配器能将因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存 ...

  3. java中输出时 什么作用_JAVA中输入和输出处理(Java I/O)重点总结

    文件-使用File类操作文件: 什么是文件?  文件可认为是相关记录或放在一起的数据的集合. 文件一般存储在哪里?  储存在存储设备里. Java程序如何访问文件?  Java API:java.io ...

  4. Java中如何引用另一个类里的集合_【18期】Java序列化与反序列化三连问:是什么?为什么要?如何做?...

    Java序列化与反序列化是什么? Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程: 序列化:对象序列化的最主要的用处就是在传递和保存对象 ...

  5. 设计模式之适配器模式--java描述

    转载:http://www.importnew.com/23477.html   (推荐此链接,讲的比较通俗易懂),也可以参考博客:http://www.cnblogs.com/maowang1991 ...

  6. java 分时图_软件设计模式(观察者模式)——模拟股票价格变动并绘制分时图和K线图...

    一.观察者模式简介: 首先看百度百科上对观察者模式的简介:观察者模式(Observer)完美的将观察者和被观察的对象分离开.举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数 ...

  7. Java笔记018-抽象类、抽象类最佳实践-模板设计模式、接口、内部类

    目录 抽象类 先看一个问题 小结: 抽象类快速入门 抽象类的介绍 抽象类使用的注意事项和细节讨论 抽象类练习题 抽象类最佳实践-模板设计模式 基本介绍 模板设计模式能解决的问题 最佳实践 最佳实践 接 ...

  8. java教师和学生类的继承代码_继承学生类java

    计算机科学与技术专业课程 课程简介 1.数字逻辑电路: "数字逻辑"是计算机专业本科生的一门主要课程,具有自身的理论体系和很强的实践性.它是计算机组成原理的主要先导课程之一,是计算 ...

  9. java中pc寄存器的作用是什么_既然有PC寄存器,栈帧里的返回地址的作用是什么?...

    PC寄存器存Java字节码的指令地址. 1. 返回地址的作用 方法A调用方法B的时候,PC寄存器会跟着移动到B方法去.当B执行完后,要能返回A继续执行,就需要A当时执行到的那条指令的地址.所以,在B的 ...

最新文章

  1. linux平台调试终端,10款Linux平台上优秀的调试器,总有一款适合你!
  2. 7能进安全模式但正常启动黑屏_电脑进入系统后黑屏怎么解决
  3. Java学习日志(一)
  4. gdk_draw_arc这个函数
  5. 计算机常用控温算法,常用温度控制方法原理 -解决方案-华强电子网
  6. 鸿蒙测试机型微博,华为多款机型开启鸿蒙尝鲜:微博已适配HarmonyOS小尾巴
  7. 48 FI配置-财务会计-固定资产-与总账集成-定义折旧范围到总账的过账方式
  8. Cocos2d-x 3 X CMake MinGW版本编译运行
  9. 解决pip安装pygal在TensorFlow环境下调用失败问题
  10. 怀念童年啊!周二下午没有动画片……
  11. 关于ionic打包出错:ionic Unable to start the daemon process
  12. 最强战队出炉,2020腾讯广告算法大赛圆满落幕
  13. 软件开发人员培养计划
  14. 2.4G无线模块(NRF24L01)学习(2)——单片机互相控制LED灯
  15. 小猫盘onespace x3p系统常见操作
  16. 看什么书可以提高情商?提高情商的书籍排行榜
  17. 小米五怎么设置锁屏显示无服务器,小米手机怎么设置锁屏状态下不能关机 - 卡饭网...
  18. Android Material Design简单使用 http://www.cnblogs.com/android-blogs/p/5632103.html
  19. linux下限制每个IP网速
  20. 汽车电子测试小知识(2)——什么是SiL测试?

热门文章

  1. DSP 中的基础算法和模型的详细解析
  2. 网络摄像机产品介绍以及学习
  3. win10 休眠设置无效_win10电脑休眠后无法唤醒的解决办法
  4. 在kali使用DDos-Attack 进行DDos攻击
  5. 4.1 I/O流
  6. 手绘线条一直画不直_板绘手不稳线画不直怎么办?
  7. matlab 向量_MatLab简易教程 #4.向量、矩阵操作命令
  8. JZ73 翻转单词序列
  9. 电脑开机显示“Windows\system\vgaoem.fon”丢失的解决方法
  10. 一定要用Chrome吗?有了这些网页翻译插件,任意浏览器都能畅快玩耍