`
lintomny
  • 浏览: 225788 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Adapter - 适配器模式

阅读更多
意图
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。(GoF)

场景
相信很多人都知道什么是显卡,也有很多人知道显卡的本名——图形适配器。恩,是的,正好这回说说Apater模式,就拿显卡来例子来分析一下Adapter模式。

我们知道显示器(Client)是用来显示图形的,它是不能显示数据,它只能够接受来自图形发送设备Target的信号。可是我们手头上只有CPU(Adaptee)这个产生各种描述图形的数据的数据发送器。我们需要将这些数据让显示器进行显示,可是这两个部件却是不兼容的。于是我们需要一个中间设备,它能够将CPU“适配”于显示器,这便是我们的显卡——图形适配器(Adapter)。

java 代码
 
  1. // 图形发送设备  
  2. public class Target {  
  3.     /** 
  4.      * 传送图形信号 
  5.      */  
  6.     public String request() {  
  7.         return "Graphic sender";  
  8.     }  


java 代码
 
  1. // 显示器  
  2. public class Client {  
  3.   
  4.     public static void main(String[] args) {  
  5.         Target target = new Targete();  
  6.         System.out.println(target.request());  
  7.     }  
  8. }  

可是我们的CPU(Adaptee)只能输出0/1数据,他是个计算器,而不是图形发送设备(Target)。

java 代码
 
  1. // CPU  
  2. public class Adaptee {  
  3.     /** 
  4.      * CPU输出的数据 
  5.      */  
  6.     public String getData() {  
  7.         return "CPU data";  
  8.     }  
  9. }  

这个时候我们的显卡(Adapter)的作用便体现出来了,它负责对CPU进行适配,通过将CPU传过来的数据转换成图形信号,从而将CPU伪装成一个图形发送设备。

java 代码
 
  1. // 显卡,即我们的适配器  
  2. public class Adapter extends Target {  
  3.   
  4.     // 被代理的设备  
  5.     private Adaptee apt = null;  
  6.   
  7.     /** 
  8.      * 装入被代理的设备 
  9.      */  
  10.     public Adapter(Adaptee apt) {  
  11.         this.apt = apt;  
  12.     }  
  13.   
  14.     /** 
  15.      * 被代理的设备传过来的数据转换成为图形输出 
  16.      */  
  17.     public String request() {  
  18.         return apt.getData();  
  19.     }  
  20. }  

这样,我们的电脑的显示流程就变成CPU-显卡-显示器:

java 代码
 
  1. public class Client {  
  2.   
  3.     public static void main(String[] args) {  
  4.         // CPU经过显卡的适配后“变”成了图形发送装置了  
  5.         Target target = new Adapter(new Adaptee());  
  6.         System.out.println(target.request());  
  7.     }  
  8.       
  9. }  

上面的这种依赖于对象组合的Adapter模式叫做对象适配器(Object Adapter)。它的特征是继承/实现某一方的类(Target),如这里的图形发送器,同时内部包含一个被适配的类(Adaptee),如这里的CPU。通过重写其父类的方法来进行适配。

另一种的Adapter实现

对于Adapter模式,还有另外一种实现方式,这种适配方式叫做类适配器(Class Adapter)。它与Object Adapter的不同之处在于它继承被适配的对象。

java 代码
 
  1. public class Adapter extends Targer, Adaptee {  
  2.     ......  
  3. }  

这样的代码在C++中是合法的,但是在Java中规定最多只能继承一个父类,而可以实现多个接口。所以我们需要建立一个IAdaptee的接口,然后将我们的Adapter继承Target同时实现IAdaptee。

java 代码
 
  1. // IAdaptee接口  
  2. public interface IAdaptee {    
  3.     String getData();  
  4. }   

java 代码
 
  1. // Adaptee 实现IAdaptee 
  2. public class Adaptee implements IAdaptee {  
  3.   ......  
  4. }    

java 代码
 
  1. public class Adapter extends Target implements IAdaptee {  
  2.   
  3.     private IAdaptee apt = null;  
  4.   
  5.     public Adapter(IAdaptee apt) {  
  6.         this.apt = apt;  
  7.     }  
  8.   
  9.     public String request() {  
  10.         return apt.getData();  
  11.     }  
  12.   
  13.     public String getData() {  
  14.         return apt.getData();  
  15.     }  
  16. }  

对于我们的显示器(Client)方面,Class Adapter跟Object Adapter一样,所以不需要进行修改。

对于Class Adapter,大家也看见了,在Adapter中因为是实现了IAdaptee接口,因此需要实现getData()的接口。一旦Target和IAdaptee拥有相同的方法时,会出现麻烦的。所以尽量优先使用Object Adapter的模式。

小结
作为总结,我觉得显卡本身的定义便很能表达Apater设计模式:“它是主机与显示器之间连接的“桥梁”,作用是控制电脑的图形输出,负责将CPU送来的的影象数据处理成显示器认识的格式,再送到显示器形成图象。
分享到:
评论
7 楼 qqwjz 2007-07-09  
个人认为Adaptee ,Target 是相对的,要看你原来的主程序使用的是哪个接口。一般把程序中使用的那个接口作为Target。
6 楼 glassesbamboo 2007-06-11  
为什么不用:
public class Adapter extends Adaptee implements ITarget {
.......
}

实现呢?
5 楼 liuganquan 2007-05-22  
呵呵,都是初级会员
javastudy 写道
liuganquan 写道
优先使用组合 而不是继承 ,所以object adapter要优于class adapter~~~



那要看什么情况拉


最好少用继承,除非确定基类变化小,并且子类通用代码多的情况
4 楼 lintomny 2007-04-25  
liuganquan 写道
优先使用组合 而不是继承 ,所以object adapter要优于class adapter~~~


正如你所说的Object Adapter要优于Class Adapter,我的笔记里没有记录Class Adapter。你不说我还忘了补充Class Adapter的内容呢。呵呵。

原文补充上了这方面的内容了。
3 楼 lintomny 2007-04-25  
daynight830 写道
其实把适配器比作笔记本的变压器更为合适。


或许你这么说也可以,通过电源适配器将不合适的电源转换成笔记本能够正常工作的电压。

适配器的作用就是将不合适不兼容的两个部件,通过一定的处理转换达到兼容。

刚想到我笔记本上有一个六合一读卡适配器。呵呵!:D
2 楼 liuganquan 2007-04-24  
优先使用组合 而不是继承 ,所以object adapter要优于class adapter~~~
1 楼 daynight830 2007-04-24  
其实把适配器比作笔记本的变压器更为合适。

相关推荐

    设计模式--适配器模式java例子

    在“设计模式--适配器模式java例子”中,我们可以假设有一个遗留的`OldLibrary`,它的接口与我们当前项目的需求不一致。例如,`OldLibrary`有一个`OldDevice`类,它有一个方法`oldMethod()`,而我们的新系统需要一个...

    设计模式之--适配器模式

    适配器模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,特别是在解决系统间的兼容性和接口不匹配问题时。适配器模式的核心思想是将一个类的接口转换成客户希望的另一个接口,使原本由于接口不兼容而无法...

    23种设计模式--适配器模式

    适配器模式是一种软件设计模式,它允许两个不兼容的接口之间进行通信。在软件工程中,这种模式常被用来解决旧系统与新系统、第三方库或者不同组件之间的接口不匹配问题。适配器模式的核心思想是通过创建一个新的类...

    设计模式 - 适配器模式(C++实例)

    在`DesignMode_Adapter`这个压缩包文件中,可能包含了相关的C++源码示例,演示了如何创建和使用适配器模式。这些源码可能包括了目标接口、原始接口、适配器类的定义以及客户端如何通过适配器进行调用的示例。通过...

    设计模式-适配器模式(讲解及其实现代码)

    适配器模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,特别是在处理系统集成、遗留代码重用以及不同接口之间兼容性问题时。适配器模式的主要目的是将两个不兼容的接口融合在一起,使得原本无法直接协作...

    java常用设计模式-适配器模式

    java常用设计模式-适配器模式 适配器模式(Adapter Pattern)是一种结构型设计模式,它允许不兼容的接口之间进行通信。这种模式可以在不修改现有代码的情况下重用现有类,并且可以使不兼容的接口之间进行通信。 ...

    c++设计模式-结构型模式-适配器模式

    c++设计模式-结构型模式-适配器模式,其他工程,c++源码。适配器模式(Adapter)的定义如下:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。

    设计模式--适配器模式

    适配器模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,特别是在解决系统间的兼容性和接口不匹配问题时。适配器模式的核心思想是将一个类的接口转换成客户希望的另一个接口,使原本由于接口不兼容而无法...

    PHP5设计模式-适配器模式实现

    适配器模式是一种结构型设计模式,它的主要目的是使不兼容的接口能够协同工作。在实际开发中,我们可能会遇到这样的情况:一个类库或者服务提供了一个接口,而我们的代码需要使用另一个接口。适配器模式就充当了两者...

    设计模式实验报告-适配器模式.docx

    适配器模式(Adapter Pattern)是一种结构型设计模式,其主要目的是将一个类的接口变换成客户端所期待的另一种接口。通过这种方式,原本由于接口不兼容而无法一起工作的类可以顺利合作。适配器模式有两种实现方式:...

    OC-适配器模式-适配支付接口

    适配器模式是一种软件设计模式,它允许两个不兼容的接口之间进行通信。在本文中,我们将深入探讨适配器模式的应用,特别是在OC(Objective-C)中如何利用它来适配支付接口。适配器模式的核心思想是创建一个新的类,...

    8.设计模式-适配器模式1

    在对象适配器模式中,适配器类(Adapter)实现目标接口(Target),并将适配者类(Adaptee)的对象作为内部成员变量持有。当调用适配器类的方法时,适配器会转发调用给适配者对象,经过适当的转换处理,返回客户需要...

    讲故事,学(Java)设计模式-适配器模式Java开发Ja

    类适配器模式通常涉及到接口的继承,例如,假设有一个旧的`OldDevice`接口,它与新的`NewDevice`接口不兼容,我们可以通过创建一个适配器类`Adapter`,继承`OldDevice`并实现`NewDevice`,这样`Adapter`就可以作为`...

    Adapter(适配器模式)

    适配器模式是一种软件设计模式,它允许两个不兼容的接口之间进行通信。在软件工程中,当系统中存在已有的类或库,而我们希望使用它们的功能,但其接口与我们的需求不匹配时,适配器模式就显得尤为重要。通过适配器,...

    设计模式结构型-适配器

    **适配器模式**(Adapter Pattern)属于结构型设计模式,它的目的是将一个接口转换成客户希望的另一个接口,从而使得原本由于接口不兼容而无法一起工作的那些类能够合作。适配器模式有两种形式:类适配器模式和对象...

    设计模式 - 适配器

    适配器模式(Adapter Pattern)是一种结构型设计模式,它允许两个不兼容的接口之间进行通信。在实际应用中,我们常常遇到这样的情况:一个系统需要使用现有的类,但其接口与系统的需求不匹配。适配器模式能解决这种...

    codelab-adapter-4_9_1-win.zip

    在计算机编程中,适配器(Adapter)是一种设计模式,它的作用是使两个不兼容的接口能够协同工作。在这个特定的案例中,codelab-adapter可能是为了使Scratch3与特定的教学平台或设备(如Codelab)进行无缝对接,提供...

    设计模式专题之(八)适配器模式---设计模式适配器模式示例代码(python--c++)

    在压缩包中,`Adapter.cpp`可能是C++实现适配器模式的代码文件,它可能包含了`CPlusPlusClass`和`CppAdapter`的定义。而`Adapter.py`则是Python版本的适配器实现,可能会包含`PythonAdapter`类,它将`CPlusPlusClass...

    Android开发---适配器

    在Android开发过程中,适配器(Adapter)是一种非常重要的设计模式,它主要应用于数据与UI之间的桥梁搭建,使得视图能够灵活地展示来自不同数据源的数据。简单来说,适配器就像是一个中介者,将复杂的数据结构转换成...

    java设计模式之适配器模式

    适配器模式(Adapter Pattern)是通过创建一个新的对象(适配器),这个对象将原本不兼容的对象接口转换为客户端期望的接口,从而使两者能够协同工作。适配器模式可以分为类适配器和对象适配器两种类型。 1. 类...

Global site tag (gtag.js) - Google Analytics