定义“转换接口”

一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

我理解的“一个类的接口”是被适配对象Adapteede 接口,“客户希望的另外一个接口”就是客户端已经的接口,因为客户端只能适应这一种接口,所以它期望这个接口

实现目标:就是客户端Client希望通过这个原有的Target接口,实现被适配对象的新功能

模式中的角色:
 目标接口(Target):客户所期待的接口,就是客户现在有的接口,旧接口。目标可以是具体的或抽象的类,也可以是接口。
    需要适配的类(Adaptee):需要适配的类或适配者类,就是需要的接口,需要用旧接口实现新功能的新接口

适配器(Adapter)通过包装一个需要适配的对象,把原接口转换成目标接口

UML图:

Target.java

/*** */
package com.hust.adapter1;/*** @author tuke**/
public interface Target {public void Request();
}

NowConcreteTarget.java

/*** */
package com.hust.adapter1;/*** @author tuke**/
public class NowConcreteTarget implements Target {public void Request() {System.out.println("这是一个现有的具体类,与客户端相适应的接口,只具有普通功能");}}

Adaptee.java

/*** */
package com.hust.adapter1;/*** @author Administrator* 已存在的、具有特殊功能、但不符合我们既有的标准接口的类,被适配的类就是客户端要通过现有的接口(Target的Request方法)获得这个被适配的方法SpecificRequest*/
public class Adaptee {public void SpecificRequest(){System.out.println("被适配的类,有特殊功能");}
}

Adapter.java

/*** */
package com.hust.adapter1;/*** @author tuke* 适配器类,直接关联被适配类,同时实现标准接口*/
public class Adapter implements Target {//实现现有接口,即标准接口,旧接口,现有接口private Adaptee mAdaptee;//被适配类的对象做成员变量,就是组合不适合现有接口的类的对象public Adapter(Adaptee mAdaptee) {       this.mAdaptee = mAdaptee;}public void Request() {  //  Request是客户端期待的接口,即是现有接口,旧接口,因为就现在来看,客户端只能适应这种接口mAdaptee.SpecificRequest();  //SpecificRequest这是新的接口,不适合客户端的接口,所以要适配,客户端通过现有接口Request就能实现新的功能}}

自己实践了一个别人的栗子,很好的栗子。

我们国家的电器使用普通的扁平两项或三项插头,而去外国的话,使用的标准就不一样了,比如德国,使用的是德国标准,是两项圆头的插头。如果去德国旅游,那么我们使用的手机充电器插头无法插到德国的插排中去,那就意味着我们无法给手机充电。怎样解决这个问题呢?只要使用一个电源转化器就行了。
该适配器下面的插头符合德国标准,可以插到德国的插排中去,上面提供的接口符合国标,可以供我们的手机充电器使用

实现电源适配器:

1,代码中有两个接口,分别为德标接口和国标接口,分别命名为DBSocketInterface和GBSocketInterface,

2.此外还有两个实现类,分别为德国插座和中国插座,分别为DBSocket和GBSocket。

3,为了提供两套接口之间的适配,我们提供了一个适配器,叫做SocketAdapter。

4,除此之外,还有一个客户端,比如是我们去德国旅游时住的一家宾馆,叫Hotel,在这个德国旅馆中使用德国接口

德国接口:DBSocketInterface.java

package com.hust.adapter2;
/*** 德标接口*/
public interface DBSocketInterface {/*** 这个方法的名字叫做:使用两项圆头的插口供电* */void powerWithTwoRound();
}

DBSocket.java

package com.hust.adapter2;/*** 德国插座*/
public class DBSocket implements DBSocketInterface{public void powerWithTwoRound(){System.out.println("使用两项圆头的插孔供电");}
}

德国旅馆是一个客户端,它里面有德标的接口,可以使用这个德标接口给手机充电:

package com.hust.adapter2;
public class Hotel {//旅馆中有一个德标的插口接口private DBSocketInterface dbSocket;public Hotel(){}public Hotel(DBSocketInterface dbSocket) {this.dbSocket = dbSocket;}public void setSocket (DBSocketInterface dbSocket){this.dbSocket = dbSocket;}//旅馆中有一个充电的功能public void charge(){//使用德标插口充电dbSocket.powerWithTwoRound();}
}

现在写一段代码进行测试:

package com.hust.adapter2;public class Test {public static void main(String[] args) {//初始化一个德国插座对象, 用一个德标接口引用它DBSocketInterface dbSoket = new DBSocket();//创建一个旅馆对象Hotel hotel = new Hotel(dbSoket);//在旅馆中给手机充电hotel.charge();}
}

输出:使用两项圆头的插孔供电
现在我去德国旅游,带去的三项扁头的手机充电器。如果没有带电源适配器,我是不能充电的,因为不可能为了我一个旅客而为我更改墙上的插座,更不可能为我专门盖一座使用中国国标插座的宾馆。

因为人家德国人一直这么使用,并且用的挺好,俗话说入乡随俗,我就要自己想办法来解决问题。对应到我们的代码中,也就是说,上面的Hotel类,DBSocket类,DBSocketInterface接口都是不可变的(由德国的客户提供),如果我想使用这一套API,那么只能自己写代码解决。

GBSocketInterface.java

package com.hust.adapter2;
/** 国标接口* */
public interface GBSocketInterface {/*** 这个方法的名字叫做:使用三项扁头的插口供电*/void powerWithThreeFlat();
}

GBSocket.java

package com.hust.adapter2;/*** 中国插座*/
public class GBSocket implements GBSocketInterface{public void powerWithThreeFlat() {System.out.println("使用三项扁头插孔供电");}
}

可以认为这两个东西是我带到德国去的,目前他们还不能使用,因为接口不一样。那么我必须创建一个适配器,这个适配器必须满足以下条件
1 ,必须符合德国标准的接口,否则的话还是没办法插到德国插座中

2 ,在调用上面实现的德标接口进行充电时,提供一种机制,将这个调用转到对国标接口的调用 。
这就要求:

1 ,适配器必须实现原有的旧的接口

2, 适配器对象中持有对新接口的引用,当调用旧接口时,将这个调用委托给实现新接口的对象来处理,也就是在适配器对象中组合一个新接口。

SocketAdapter.java

package com.hust.adapter2;
/** 插座适配器* */
public class SocketAdapter  implements DBSocketInterface{   //实现旧接口,现有接口private GBSocketInterface gbSocket;//组合新接口,不适合现有接口的类,需要被适配的类/*** 在创建适配器对象时,必须传入一个新街口的实现类* @param gbSocket*/public SocketAdapter(GBSocketInterface gbSocket) {this.gbSocket = gbSocket;}/*** 将对就接口的调用适配到新接口*/public void powerWithTwoRound() {gbSocket.powerWithThreeFlat();}
}

下面写一段测试代码来验证一下适配器能不能工作,我们按步骤一步步的写出代码,以清楚的说明适配器是如何使用的。
1 我去德国旅游,带去的充电器是国标的(可以将这里的GBSocket看成是充电器)

//国标插座适配器GBSocketInterface gbSocket = new GBSocket();

2 来到德国后, 找到一家德国宾馆住下 (这个宾馆还是上面代码中的宾馆,使用的依然是德国标准的插口)

//客户端
Hotel hotel = new Hotel(); 

3 由于没法充电,我拿出随身带去的适配器,并且将我带来的充电器插在适配器的上端插孔中。这个上端插孔是符合国标的,我的充电器完全可以插进去。

//插座适配器
SocketAdapter socketAdapter = new SocketAdapter(gbSocket);

4 再将适配器的下端插入宾馆里的插座上

//客户端设置适配器hotel.setSocket(socketAdapter);    

5 可以在宾馆中使用适配器进行充电了

//调用客户端的原有接口,但是有了适配器,适配了不合适的类,使用的是同一个方法就有了新功能hotel.charge();

这个栗子对理解适配器模式很好,贴近生活。

TestAdapter.java

package com.hust.adapter2;public class TestAdapter {public static void main(String[] args) {//国标插座适配器GBSocketInterface gbSocket = new GBSocket();//客户端Hotel hotel = new Hotel();   //插座适配器SocketAdapter socketAdapter = new SocketAdapter(gbSocket);//客户端设置适配器hotel.setSocket(socketAdapter); //调用客户端的原有接口,但是有了适配器,适配了不合适的类,使用的是同一个方法就有了新功能hotel.charge();}
}

参考:http://www.2cto.com/kf/201401/275535.html

Java设计模式-适配器模式Adapter相关推荐

  1. Java设计模式—适配器模式(adapter pattern)

    现在的手机很多都取消了3.5mm的耳机接口,只留下了一个type-c接口.但是我现在只有一个3.5mm圆孔接口的耳机,我不得不通过一个转接线使得3.5mm的耳机变成type-c接口. //Type-C ...

  2. Java | 设计模式-适配器模式

    继代理模式后又来到适配器模式啦,想看之前的也有哦.持续更新中哦.让我们一起加油吧兄弟们,干他. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 你好,如果喜欢,请一起坚持!! ...

  3. java设计模式适配器模式_Java中的适配器设计模式

    java设计模式适配器模式 适配器设计模式是一种结构设计模式 ,可以帮助我们连接到通过不同接口公开相似功能的旧版或第三方代码. 适配器的现实世界是我们用来将USB电缆连接到以太网端口的类比. 在设计一 ...

  4. java设计模式适配器模式_Java解释器设计模式

    java设计模式适配器模式 Interpreter design pattern is one of the behavioral design pattern. Interpreter patter ...

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

    [设计模式]Java设计模式 - 适配器模式

  6. Java设计模式——适配器模式【Adapter Pattern】

    一.引言 23种设计模式大概分为三大类: 5种(创建型模式):工厂方法模式.抽象工厂模式.单例模式.原型模式.建造者模式. 7种(结构型模式):适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组 ...

  7. JAVA设计模式--适配器模式

    目录 1.什么是适配器模式 2.适配器模式的适用场景 3.适配器模式的结构 4.适配器模式应用举例 5.适配器模式的选择 参考文章 1.什么是适配器模式 适配器(Adapter)模式又叫做包装( Wr ...

  8. JAVA设计模式-适配器模式(Adapter)

    适配器模式 当我们需要一个转换头的时候,可以考虑到适配器模式 现实生活中的适配器(兼容): VGA-HDMI/充电头/插头转换/编码解码/调制解调器 系统应用场景: 老系统运行了很久比较稳定,为了保证 ...

  9. 3.设计模式--适配器模式(adapter模式)

    1.场景 适配器模式可能是开发人员用的最多的一种设计模式,做后台开发你可能每天都在使用.只是不知道他的名字:现实中的适配器你应该不会陌生,新款的IQOO 8 pro手机充电器已经达到了120w,实际上 ...

最新文章

  1. MathType公式行距设置的方法
  2. 虚拟服务器目录,服务器虚拟主机目录
  3. 1646. 获取生成数组中的最大值
  4. 怎样把MySQL的编码方式改为utf8?
  5. wordpress开放注册_WordPress.com开源,欧洲开放数据门户网站以及更多新闻
  6. DPM 检测源码分析
  7. php apache 配置后不能正常显示html文件的解决方法
  8. Windows下VB6.0开发——VB程序断点调试与顺序执行不一致问题(通信原因)
  9. 大数据与python-零起点Python大数据与量化交易 PDF 下载
  10. java httpclient 关闭_httpclient 4种关闭连接
  11. MATLAB打不开,选择licenses激活成功后还是要激活
  12. 爬虫国际统计局省市区
  13. 法线向量扰动、副法线
  14. 字体在ppt中可以整体替换吗_PPT字体替换其实很简单
  15. 如何学习一门新的计算机语言
  16. 深读5G发展的趋势后带给我的感受
  17. 古罗马数字的基本知识
  18. 2022年注册会计师(CPA)考试精选试题及答案
  19. 资源 步金国 的高手
  20. 【java】设置下载的Excel不可编辑复制

热门文章

  1. 登陆共享服务器的位置,共享服务器哪里登陆
  2. C++ Primer 5th笔记(chap 16 模板和泛型编程)可变参数模板举例
  3. Bech32编码 (2)原理
  4. Html 教程 (10)分组标签div 和span
  5. (chap4 Http状态码) 3XX重定向
  6. C++ Primer 5th笔记(chap 13 拷贝控制) 实例2内存管理
  7. python—多进程之进程的创建(一)
  8. 字符串格式化漏洞修改GOT表一例
  9. 虚拟键码 键盘消息(初稿)
  10. 第一次scrapy爬虫记录