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

来源:互联网 发布:mac制作铃声的教程 编辑:程序博客网 时间:2024/06/06 00:52

一. 概述

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

二. 解决的问题

  即Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

三. 模式中的角色

3.1目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。

3.2需要适配的类(Adaptee):需要适配的类。

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

代码结构

Target

[java] view plaincopyprint?
  1.    
  2. public interface Target {    
  3.     void adapterMethod();  
  4. }  

Adaptee

[java] view plaincopyprint?
  1. public class Adaptee {  
  2.    
  3.     public void adapteeMethod() {  
  4.         Syste.out.ptintln("Adaptee method!");  
  5.     }  
  6. }  

Adapter

对象适配器:

[java] view plaincopyprint?
  1. public class Adapter implements Target {  
  2.    
  3. //引入被适配者  
  4. private Adaptee adaptee;  
  5.       
  6.     public Adapter(Adaptee adaptee) {  
  7.         this.adaptee = adaptee;  
  8.     }  
  9.    
  10.         public void adapterMethod() {  
  11.                System.out.println("Adapter method!");  
  12.     }  
  13. }  

类适配器:

[java] view plaincopyprint?
  1.  Public class Adapter extends Adapteee implements Target {  
  2.         public void adapterMethod() {  
  3.                System.out.println("Adapter method!");  
  4.     }  
  5. }  

Client

[java] view plaincopyprint?
  1. public class Test {  
  2.    
  3.     public static void main(String[] args) {  
  4.         Target target = new Adapter(new Adaptee());          
  5.         target.adapterMethod();  
  6.     }  
  7. }  

result

Adapter method!

四、例子

PS2接口

[java] view plaincopyprint?
  1. /** 
  2.  * PS2接口,圆口 
  3.  */  
  4. public interface PS2Port {  
  5.     public void workWithPS2();  
  6. }  

usb接口

[java] view plaincopyprint?
  1. /** 
  2.  * USB接口,U口 
  3.  */  
  4. public interface USBPort {  
  5.     public void workWithUSB();  
  6. }  

PS2ToUSB转换器

[java] view plaincopyprint?
  1. /** 
  2.  * 对象适配器 
  3.  * 将PS2接口装换成USB接口 
  4.  * 所以此类类型是USB接口(implements USBPort) + 成员变量ps2Port 
  5.  */  
  6. public class PS2ToUSB implements USBPort {  
  7.   
  8.     private PS2Port ps2Port;  
  9.   
  10.     public PS2ToUSB(PS2Port ps2Port) {  
  11.         this.ps2Port = ps2Port;  
  12.     }  
  13.   
  14.     @Override  
  15.     public void workWithUSB() {  
  16.         System.out.println("转换的关键在这里,本来是");  
  17.         ps2Port.workWithPS2();  
  18.         System.out.println("经过你的转换,现在是USB工作中");  
  19.     }  
  20.   
  21. }  

场景类

[java] view plaincopyprint?
  1. public class Client {  
  2.   
  3.     public static void main(String[] args) {  
  4.         //1.我现在有一个PS2接口  
  5.         PS2Port ps2Port = new WorkPiece();  
  6.         //2.但是我需要的是一个USB接口啊,对我(client)来说,我只认识USB接口  
  7.         //3.经过PS2ToUSB的转换,PS2接口变成了USB接口  
  8.         USBPort ps2ToUsbPort = new PS2ToUSB(ps2Port);  
  9.         ps2ToUsbPort.workWithUSB();  
  10.   
  11.     }  
  12.   
  13. }  

其中的WorkPiece 只是一个PS2接口的一个子类

[java] view plaincopyprint?
  1. public class WorkPiece implements PS2Port {  
  2.   
  3.         public void workWithPS2() {  
  4.             System.out.println("PS2工作中");  
  5.         }  
  6.   
  7.     }   

五. 模式总结

5.1 优点

  1. 通过适配器,客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单、更直接、更紧凑。
  2. 复用了现存的类,解决了现存类和复用环境要求不一致的问题。
  3. 将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码。
  4. 一个对象适配器可以把多个不同的适配者类适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。

5.2 缺点

    对于对象适配器来说,更换适配器的实现过程比较复杂。

5.3 适用场景

  1. 系统需要使用现有的类,而这些类的接口不符合系统的接口。
  2. 想要建立一个可以重用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
  3. 两个类所做的事情相同或相似,但是具有不同接口的时候。
  4. 旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候。
  5. 使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。

5.4 “对象”适配器和“类”适配器。

1)对象适配器:使用对象组合,以修改的接口包装被适配者,被适配者的任何子类都可以搭配着适配器使用。

2)类适配器:使用继承,不需要重新实现整个被适配者。

6. 适配器应用举例

手机电源适配器

 

在java 中有一种叫做“缺省适配模式”的应用,它和我们所讲的适配器模式是完全的两种东西。缺省适配模式是为一个接口提供缺省的实现,这样子类型就可以从缺省适配模式中进行扩展,避免了从原有接口中扩展时要实现一些自己不关心的接口。在java.awt.event 中的XXXAdapter 就是它的很好的例子

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电脑版迷你世界打不开怎么办 电脑的腾讯视频打不开怎么办 好多程序连不上网了怎么办 掌游宝炉石传说卡组复制不了怎么办 花呗不能充话费怎么办 想用话费充王者怎么办 苹果6s激活出错怎么办 联通话费充多了怎么办? 电信宽带充值充到别人账号了怎么办 未实名的支付宝钱转不出来怎么办 手机打游戏闪屏怎么办 支付宝手机冲错怎么办 手机停用了支付宝充值码怎么办 苹果手机桌面上找不到支付宝怎么办 苹果手机支付宝找不到了怎么办 微信上充话费没到账怎么办 冲q币不到账怎么办 支付宝冲话费没到帐怎么办 qq实名认证没有银行卡怎么办 微信零钱限额没有银行卡怎么办 qq钱包忘记支付密码怎么办 零钱包密码忘了怎么办 关爱通密码知道卡号忘了怎么办 卡号的密码忘了怎么办 银行卡号密码忘了怎么办 微信超出单月支付限额怎么办 行李箱三位数密码忘记了怎么办 手机忘记4位数密码怎么办 win7登入密码忘记了怎么办 电脑登入密码忘记了怎么办 电脑忘记登入密码怎么办 qq钱包支付密码忘了怎么办 财付通转走我卡里的钱怎么办 银行卡资金通过财付通被盗怎么办 社保卡忘了密码怎么办 医保卡忘了密码怎么办 手机qq红包忘记支付密码怎么办 微信红包忘记支付密码怎么办 充点话费充错了怎么办 qq转账记录删除了怎么办 qq转账记录删了怎么办