`

适配器模式

 
阅读更多

配器模式

 

一、适配器模式

    先说说什么是适配器。其实生活中有很多例子。比如2008年的时候买了一台Macbook,有一次做课程设计的时候在课堂上做演示汇报,需要连教室的投影仪。上去的时候突然发现,晕,Macbook的投影接口和教室投影仪的接口根本就对不上,顿时石化。。。后来赶紧去网上查了一下,发现Macbook的投影接口与其他品牌的PC是不一样的,需要另外花钱买一个转接器,还好有淘宝,最后花了差不多20大洋终于搞定。这里说的转接器其实就是一个所谓的适配器。它承担着让不同接口之间实现协同工作的功能。家里的水管和各种各样的水龙头之间很多时候不能直接接上,中间也许要一些其他的管子、零件什么的在中间。这些管子往往两头口子大小是不一样的。

    上面的例子只是为了方便理解,可能并不那么准确,那下面我们说说适配器模式的定义:Convert the interface of a class into another interface clients expect。适配器模式能让原本互相接口不能匹配的类变得能够一起工作。也就是说,适配器将一个类的接口变成客户端所期望的另外一个接口。

    适配器模式有两种类型:类的适配器模式和对象的适配器模式。

    类的适配器模式比较通用的类图如图所示:

    如图所示,适配器Adapter将被适配的对象的接口转换成客户端需要的Target所规定的接口。通过适配器,客户端可以将Adaptee类当作一个Target来与之协同工作。我们举个例子。我们首先定义目标Target接口,Target接口之规定了一个方法:request(),其代码如下所示:

package dp.adapter;

public interface Target {
    public void request();
}

    源对象Adaptee代码如下:

复制代码
package dp.adapter;

public class Adaptee {
    public void doSth() {
        System.out.println("做我自己的事情");
    }
}
复制代码

    对于适配器来说,要达到适配的作用,需要继承源对象Adaptee并且实现目标接口Target,我们看看代码:

复制代码
package dp.adapter;

public class Adapter extends Adaptee implements Target{
    @Override
    public void request() {
        super.doSth();
    }
}
复制代码

    这样,客户端可以通过调用Target对象的request方法,享受到实际上Adaptee对象的doSth中提供的服务。这样一来,接口不匹配的问题就搞定了,代码如下:

复制代码
package dp.adapter;

public class Client {
    public static void main(String[] args) {
        Target t = new Adapter();
        t.request();
    }
}
复制代码

    运行一下,结果如下:

    对象的适配器模式如图所示:

    在这种适配器模式中,适配器类Adapter和源Adaptee之间的关系不再是集成关系,而是一种委托的关系。Adapter往往持有一个Adaptee的引用。我们将上面的代码例子中Adapter的代码进行修改:

复制代码
package dp.adapter;

public class Adapter2 implements Target{
    private Adaptee adaptee;
    
    @Override
    public void request() {
        adaptee.doSth();
    }
    
}
复制代码

    我们运行Client端程序,结果没有什么变化。

二、JDK中用到适配器模式的例子

    在JDK中,适配器是一个非常重要的设计模式。尤其是在Java IO包的设计上,使用很广泛。在Java的IO包中有一对类,分别叫做InputStreamReader和OutputStreamWriter。他们负责对字节流和字符流进行转换,因此有的资料称他们为桥梁类。尽管名字叫桥梁类,但是他们并不是那个桥梁模式的应用。而是典型的适配器模式的应用。

    对于InputStreamReader来说,它一个字节流到字符流的适配器,它的实现主要采用的是对象适配器模式,如图所示:

   对于OutputStreamWriter来说也是类似的。

三、适配器模式的使用场景

    适配器模式实际上是一个补偿型模式,一般不会在进行系统设计的时候用到。往往当你打算修改正在服役的系统的某个接口时,可以考虑是否用的上。

 

分享到:
评论

相关推荐

    JAVA设计模式(抽象类与适配器模式)

    今天我们要探讨的是JAVA设计中的两个重要模式:抽象类与适配器模式。 首先,我们来理解一下“抽象”。抽象是面向对象编程的核心概念之一,它帮助我们处理对象的复杂性。在Java中,抽象通常通过抽象类来实现。抽象类...

    设计模式之适配器模式Java实现和类设计图

    在这个Java实现中,我们将深入探讨适配器模式的两大类型:类适配器模式和对象适配器模式,并通过具体的代码示例和UML类图来阐述其工作原理。 首先,我们来理解适配器模式的基本概念。适配器模式就像现实生活中的...

    设计模式之适配器模式

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

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

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

    java 动态代理模式 适配器模式

    Java动态代理模式与适配器模式是两种在软件设计中常用的设计模式,它们都有各自的优点和应用场景。在Java中,动态代理模式主要依赖于Java的反射API和InvocationHandler接口,而适配器模式则用于解决不同接口之间的...

    java设计模式之适配器模式

    适配器模式是一种在软件工程中广泛使用的结构型设计模式,它允许两个不兼容的接口之间进行通信。在Java中,适配器模式扮演着重要的角色,尤其在处理遗留代码或者第三方库集成时,能够有效地解决接口不匹配的问题。...

    java中适配器模式案例

    适配器模式是一种设计模式,它允许不兼容的类或接口之间进行通信,通过创建一个适配器类作为中间桥梁,使得原本不匹配的接口能够协同工作。在Java中,适配器模式广泛应用于系统集成、旧代码复用以及第三方库的兼容性...

    适配器模式案例代码

    适配器模式是一种软件设计模式,它允许两个不兼容的接口之间进行通信。在这个案例中,我们关注的是如何通过适配器模式解决实际编程问题。文章《适配器模式案例代码》提供了具体的实现示例,链接指向了CSDN博主...

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

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

    适配器模式demo源码

    适配器模式是一种常用的设计模式,它在软件开发中起到了桥梁的作用,允许两个不兼容的接口之间进行通信。在这个“适配器模式demo源码”中,我们可以深入理解这一模式的实现方式及其应用场景。 适配器模式的核心思想...

    设计模式系列之适配器模式

    适配器模式是一种软件设计模式,它在不同的接口之间起到了桥梁的作用,使得原本由于接口不兼容而无法协作的类能够协同工作。这种模式的核心思想是将一个类的接口转换成客户希望的另一个接口,从而使原有类能适应新的...

    设计模式的适配器模式的例子

    适配器模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,允许不同接口的类之间进行通信。适配器模式的核心思想是将一个类的接口转换成客户期望的另一个接口,使得原本由于接口不兼容而无法一起工作的类...

    实验七:适配器模式.rar

    适配器模式是一种软件设计模式,它允许两个不兼容的接口之间进行通信。在本实验中,我们将深入探讨适配器模式的概念、应用场景以及如何在实际编程中实现它。适配器模式通常分为类适配器和对象适配器两种形式。 ...

    适配器模式源代码

    适配器模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,允许不兼容的接口之间进行通信。在这个源代码实例中,我们看到的是如何通过适配器模式来实现不同对象之间的协作,使得原本无法直接交互的系统组件...

    设计模式C++学习之适配器模式(Adapter)

    适配器模式(Adapter)是软件工程中一种常用的设计模式,它允许两个不兼容的接口之间进行通信。在C++编程中,适配器模式能够帮助我们复用现有的类,或者将第三方库的接口与我们的系统接口进行对接,从而提高代码的可...

Global site tag (gtag.js) - Google Analytics