当前位置: 首页 > 编程日记 > 正文

设计模式——6适配器模式(Adapter)

6、适配器模式(Adapter)
适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。

核心思想就是:有一个Source类,拥有一个方法,待适配,目标接口时Targetable,通过Adapter类,将Source的功能扩展到Targetable里,看代码:
[java] view plaincopy

  1. public class Source {
  2. public void method1() {
  3. System.out.println("this is original method!");
  4. }
  5. }
    [java] view plaincopy
  6. public interface Targetable {
  7. / 与原类中的方法相同 /
  8. public void method1();
  9. / 新类的方法 /
  10. public void method2();
  11. }
    [java] view plaincopy
  12. public class Adapter extends Source implements Targetable {
  13. @Override
  14. public void method2() {
  15. System.out.println("this is the targetable method!");
  16. }
  17. }
    Adapter类继承Source类,实现Targetable接口,下面是测试类:

[java] view plaincopy

  1. public class AdapterTest {
  2. public static void main(String[] args) {
  3. Targetable target = new Adapter();
  4. target.method1();
  5. target.method2();
  6. }
  7. }
    输出:

this is original method!
this is the targetable method!
这样Targetable接口的实现类就具有了Source类的功能。
对象的适配器模式
基本思路和类的适配器模式相同,只是将Adapter类作修改,这次不继承Source类,而是持有Source类的实例,以达到解决兼容性的问题。

只需要修改Adapter类的源码即可:
[java] view plaincopy

  1. public class Wrapper implements Targetable {
  2. private Source source;
  3. public Wrapper(Source source){
  4. super();
  5. this.source = source;
  6. }
  7. @Override
  8. public void method2() {
  9. System.out.println("this is the targetable method!");
  10. }
  11. @Override
  12. public void method1() {
  13. source.method1();
  14. }
  15. }
    测试类:

[java] view plaincopy

  1. public class AdapterTest {
  2. public static void main(String[] args) {
  3. Source source = new Source();
  4. Targetable target = new Wrapper(source);
  5. target.method1();
  6. target.method2();
  7. }
  8. }
    输出与第一种一样,只是适配的方法不同而已。

第三种适配器模式是接口的适配器模式,接口的适配器是这样的:有时我们写的一个接口中有多个抽象方法,当我们写该接口的实现类时,必须实现该接口的所有方法,这明显有时比较浪费,因为并不是所有的方法都是我们需要的,有时只需要某一些,此处为了解决这个问题,我们引入了接口的适配器模式,借助于一个抽象类,该抽象类实现了该接口,实现了所有的方法,而我们不和原始的接口打交道,只和该抽象类取得联系,所以我们写一个类,继承该抽象类,重写我们需要的方法就行。

在实际开发中,我们也常会遇到这种接口中定义了太多的方法,以致于有时我们在一些实现类中并不是都需要。看代码:
[java] view plaincopy

  1. public interface Sourceable {
  2. public void method1();
  3. public void method2();
  4. }
    抽象类Wrapper2:

[java] view plaincopy

  1. public abstract class Wrapper2 implements Sourceable{
  2. public void method1(){}
  3. public void method2(){}
  4. }
    [java] view plaincopy
  5. public class SourceSub1 extends Wrapper2 {
  6. public void method1(){
  7. System.out.println("the sourceable interface's first Sub1!");
  8. }
  9. }
    [java] view plaincopy
  10. public class SourceSub2 extends Wrapper2 {
  11. public void method2(){
  12. System.out.println("the sourceable interface's second Sub2!");
  13. }
  14. }
    [java] view plaincopy
  15. public class WrapperTest {
  16. public static void main(String[] args) {
  17. Sourceable source1 = new SourceSub1();
  18. Sourceable source2 = new SourceSub2();
  19. source1.method1();
  20. source1.method2();
  21. source2.method1();
  22. source2.method2();
  23. }
  24. }
    测试输出:

the sourceable interface's first Sub1!
the sourceable interface's second Sub2!
达到了我们的效果!
讲了这么多,总结一下三种适配器模式的应用场景:
类的适配器模式:当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。
对象的适配器模式:当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Wrapper类,持有原类的一个实例,在Wrapper类的方法中,调用实例的方法就行。
接口的适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个抽象类Wrapper,实现所有方法,我们写别的类的时候,继承抽象类即可。

相关文章:

中国人口将迎来负增长,这是旷视们的机会

作者 | 阿司匹林 出品 | AI科技大本营 1 月 16 日,人工智能创业公司旷视科技在北京举办机器人战略发布会,发布了旷视机器人战略的核心产品——“河图(Hetu)”,用智能网络协同系统来改造传统的物流仓储行业。同时旷视还…

就看你怎么去运作

从前,有一个地方叫美国。有一个老头有三个儿子,其中大儿子、二儿子都在城里工作,他和小儿子相依为命在乡下生活。这一天,来了一个人,对他说:“我能不能把您的小儿子带到城里去工作?”老头说&…

安装EBS前期检查工具 - RDA - Health Check / Validation Engine Guide

参考文档 RDA - Health Check / Validation Engine Guide (文档 ID 250262.1) 先下载 RDA 补丁包。 Download HCVE/RDA安装RDA : Example:tar xvf rda.tarorgunzip rda.tar.gztar xvf rda.tarorunzip rda.zipNote:Each rda package (.zip, .tar, and .tar.gz) will cre…

啥是佩奇?Python告诉你

作者 | 丁彦君来源 | 恋习Python昨天,被《啥是佩奇》这支广告片刷屏了。佩奇明明是个喜剧角色,却看哭了所有人。▼《啥是佩奇》???快过年了在农村爷爷给城里的小孙子打电话小孙子说想要“佩奇”为了满足小孙子的愿望爷…

Linux中bashrc河bash_profile

/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置. /etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取. ~/.bash_profile 调用 ~/.bashrc 每个用户…

arcgis server 开发

不知道有多少人采用 adf 做开发,不知为什么,感觉在web 上用他老不爽 javascript api http://resources.esri.com/help/9.3/arcgisserver/apis/javascript/arcgis/help/jssamples_start.htm silverlight api http://resources.esri.com/help/9.3/arcgis…

详解谷歌最强NLP模型BERT(理论+实战)

作者:李理,环信人工智能研发中心vp,十多年自然语言处理和人工智能研发经验。主持研发过多款智能硬件的问答和对话系统,负责环信中文语义分析开放平台和环信智能机器人的设计与研发。 本文是作者正在编写的《深度学习理论与实战》的…

rz 和 sz

想从windows上传文件到linux中,还是rz / sz 可以用yum安装: yum install lrzsz -y 不能直接yum install rz 或者 yum install sz,只能用lrzsz来安装,-y表示之后的判断一律选择yes 使用rz从windows上传文件到linux,刚…

SMS系列之六:利用SMS实现操作系统的补丁分发

利用SMS实现操作系统的补丁分发杜 飞微软的每个操作系统都会不断的推出新的补丁,如Win2000的补丁达到SP4,XP的补丁达到SP3,Win2003也达到了SP2。那么做为一个IT管理员对员工的操作系统及时进行补丁升级也是一个日常工作。今天咱们就来看一下如…

201621123075作业12-流与文件

1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容。 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书馆管理系统或购物车。 2.1 简述如何使用流与文件改造你的系统。文件中数据的格式如何&#xff…

【Junit】BeforeClass、Before、After、AfterClass

在JUnit4中,添加了Annotations来标记测试。 测试方法由Test 标记说明。使用标记的好处是你不用将所有测试方法命名为testFoo()这种形式。 执行顺序: BeforeClass > Before > After > AfterClass 使用Before、After标签组合在每个测试方法前后都…

COCO 2018 Keypoint冠军算法解读

作者简介:王志成,清华大学计算机系硕士,现为旷视科技研究员,人体姿态估计研究负责人,COCO Keypoint 冠军算法 CPN、MSPN 共同第一作者,研究方向涵盖人体姿态估计与跟踪、人体动作识别,并在上述方…

linux下IPython的安装方法

按照下面的步骤依次执行即可。在linux环境里:wget http://ipython.scipy.org/dist/ipython-0.8.4.tar.gz说明:在官网下载ipython最新的tar包。tar zxvf ipython-0.8.4.tar.gz说明:解压下载的包。cd ipython-0.8.4说明:进入到解压后…

201621123057 《Java程序设计》第12周学习总结

1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容。 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书馆管理系统或购物车。 2.1 简述如何使用流与文件改造你的系统。文件中数据的格式如何&#xff…

对 makefile 中 .SECONDARY 的学习体会

上例子 LIBSfoo.gao bar.gao .INTERMEDIATE:$(LIBS) .SECONDARY:bar.gao all: $(LIBS) #pass foo.gao: echo $ touch $ bar.gao: echo $ touch $ make --dry-run 的结果: foo.gao touch foo.gao bar.gao touch bar.gao #pass rm foo.gao 可见,SECONDARY 确实起到…

yuml 类图设计

http://yuml.me/diagram/nofunky/class/draw 使用yuml这个工具进行类图设计&#xff1a; // Cool Class Diagram [Engine :lib/core]<>Use[App :lib/core/model] [Engine :lib/core]<>Use[Hook :lib/core/] [Engine :lib/core]<>Use[Dsl :lib/core/] [Engine…

特斯拉再裁员3000多人,马斯克称别无选择

编译整理 | 一一 出品 | AI科技大本营 去年 6 月&#xff0c;为了缩减开支&#xff0c;特斯拉宣布裁员 9%&#xff0c;涉及员工超 4000 人&#xff0c;但在不久又开启了一轮积极的招聘狂潮。现在&#xff0c;这艘大船再度面临风暴不堪重负&#xff0c;裁员潮说来就来。 北京…

一个表对应另一个表中多个主键的查询方法(把一个表当成两个表用)

表t_RecordPID(主键) SendUserID(发送人) ReceiveUserID(接收人) 1 1 2 2 2 3 3 3 1 表t_UserPID(主键) UserName(用户名) 1 张三 2 …

Keras 最新《面向小数据集构建图像分类模型》

本文地址&#xff1a;http://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html 本文作者&#xff1a;Francois Chollet 按照官方的文章实现过程有一些坑&#xff0c;彻底理解代码细节实现&#xff0c;理解keras的api具体使用方法也有…

Python处理XML文件

用代码记录下&#xff1a; import xml.dom.minidomtry:f open(filename)dom xml.dom.minidom.parseString(f.read()) finally:f.close()if dom ! None:root dom.documentElementfor element in root.getElementsByTagName("bean"):for prop in element.getElement…

李彦宏首次公布24字百度愿景,要做最懂用户的公司

编辑 | 一一 出品 | AI科技大本营 近日&#xff0c;李彦宏发布内部信并首次公布了 24 字百度愿景&#xff1a;成为最懂用户&#xff0c;并能帮助人们成长的全球顶级高科技公司。李彦宏表示&#xff0c;“这 24 个字将上承新使命、下展公司“夯实移动基础、决胜 AI 时代”的整体…

HP c3000/c7000 blade switch GBE2c 初始配置

端口概述 Port 1-16 是内联刀片的downlink口 Port 17-18 是switch互联用&#xff0c;默认是disable的 Port 19是给Blade On-board Administrator用 Port 20-24 是uplink口 连到交换机的Console口 To access the switch locally: 1. Connect the switch DB-9 serial connector, …

Travis CI : 最小的分布式系统(一)

(本文翻译自http://www.paperplanes.de/2013/10/18/the-smallest-distributed-system.html&#xff0c;由金斌_jinbin 翻译) Travis CI一开始仅仅是个想法&#xff0c;在当时甚至还有些理想化。在这个项目启动之前&#xff0c;开源社区还没有一个可用的持续集成系统。 随着作为…

Windows 7时代即将终结!

作者 | 屠敏 转载自CSDN&#xff08;ID:CSDNnews&#xff09; 2009 年诞生的 Windows 7 终究没能超过 Windows XP 13 岁的寿命。 2015 年 1 月 14 日&#xff0c;微软宣布结束对 Windows 7 操作系统的第一阶梯主流支持&#xff0c;同时为了给用户过渡升级的时间&#xff0c;…

什么是DWDM

DWDM是Dense Wavelength Division Multiplexing&#xff08;密集波分复用&#xff09;的缩写&#xff0c;这是一项用来在现有的光纤骨干网上提高带宽的激光技术。更确切地说&#xff0c;该技术是在一根指定的光纤中&#xff0c;多路复用单个光纤载波的紧密光谱间距&#xff0c;…

MySQL · myrocks · MyRocks之memtable切换与刷盘

概述 MyRocks的memtable默认是skiplist&#xff0c;其大小和个数分别由参数write_buffer_size和max_write_buffer_number控制。数据写入时先写入active memtable, 当active memtable写满时&#xff0c;active memtable会转化为immutable memtable. immutable memtable数据是不会…

URLRewriter在ASP.NET配置文件中的用法

<?xml version"1.0"?><configuration><configSections><sectionGroup name"system.web.extensions" type"System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version1.0.61025.0, Culturene…

Travis CI : 最小的分布式系统(二)

大约1年之前&#xff0c;我们发现当时的架构有些不合理了。尤其是Hub&#xff0c;它上面承担了太多的任务。Hub要接收新的处理请求&#xff0c;处理并推动构建日志&#xff0c;它要同步用户信息到Github&#xff0c;它要通知用户构建是否成功。它跟一大群外部API打交道&#xf…

百度开设「黄埔学院」,革新者来

1 月 19 日&#xff0c;百度宣布成立「黄埔学院」&#xff0c;开展深度学习架构师培养计划。并借鉴了黄埔军校大门对联的横批「革命者来」&#xff0c;将口号设置为「革新者来」。 首先&#xff0c;为什么叫「黄埔学院」&#xff1f; 2012 年初&#xff0c;百度开始进行深度学…

Linux-find命令应用举例-按时间筛选和删除文件

find参数说明&#xff1a; find有很多参数是以动作首字母时间的方式用于按访问、改变、更新时间来筛选文件。 动作表达&#xff1a; a(last accessed) 最近一次访问时间 c(last changed) 最近一次改变时间 m(last modified) 最近一次修改时间注意此上的c和m的区别&#xff0c;…