`

适配器模式

阅读更多
1.什么时候使用适配器模式
   适配器模式俗称变压器模式,指将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

   从功能上讲这些接口不兼容的类一般具有相同或相似的功能。通常我们通过修改该类的接口来解决这种接口不兼容的情形,但是如果我们不愿意为了一个应用而修改各原有的接口,或者我们压根就没有原有对象的源代码那该怎么办呢? 此时Adapter模式就会派上大用场了。

   使用适配器模式不仅保证没有修改原有的系统,更主要的是还能保证对现有类的重用。若不进行这样的转化,客户类就不能利用现有类所提供的功能。

2.适配器模式的几个要素

    适配器模式所涉及的角色包括:1.源;2.目标;3.适配器;4.客户。

1.源(Adaptee)

    已经存在的、需要适配的类。

2.目标(Target)

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

3.适配器(Adapter)

    适配器模式的核心类。有两种方式实现Adapter,对象适配器(Object Adapter)和类适配器(Class Adapter)。

4.客户(Client):

下图是Adapter设计模式中的几个对象:




3.类适配器




客户调用Target接口的request方法,实际就是调用其父类Adaptee的specialRequest方法。

代码示例如下:

//Adaptee.java
public class Adaptee{
     public void specialRequest(){
         System.out.println("Called SpecificRequest() in Adaptee ");
     }       
}

//Client.java
public class Client {
    public static void main(String[] args){
        Target t = new Adapter() ;
        t.request();
    }
}

//Target.java
public interface Target{
     public void request();
}

//Adapter.java
public class Adapter extends Adaptee implements Target{
     public void request(){
           this.specialRequest();
     }
}


4.对象适配器




  对象适配器将Adaptee对象做为一个Adapter适配器对象的一个属性,再进行调用。

示例代码:


//Adaptee.java
public class Adaptee{
     public void specialRequest(){
         System.out.println("Called SpecificRequest() in Adaptee ");
     }       
}

//Client.java
public class Client {
    public static void main(String[] args){
        Target t = new Adapter() ;
        t.request();
    }
}

//Target.java
public interface Target{
    public void request();
}

//Adapter.java
public class Adapter implements Target{
     Adaptee adaptee = new Adaptee();
     public void request(){
            adaptee.specialRequest();
     }
}


5.适配器模式的变体

    上面谈到的所有适配器都是通过重用Adaptee类从而实现Target接口中的方法。这只是具体层次的重用。是否还存在更高层次的适配器呢!?答案是肯定的!我们不仅可以适配具体的类还可以适配抽象类,甚至适配接口!下面是这种适配的简图:




   从上图可以看出:Adapter将Adaptee接口适配为客户Client需要的接口Target,这样在整个系统中所有实现Adaptee接口的类都可以通过Adapter适配为Target对象,从而避免为每一个类都写一个适配器。

6.IO库中的适配器模式

6.1 FileInputStream适配器类

   在FileInputStream继承了InputStrem类型,同时持有一个对FileDiscriptor的引用。这是将一个FileDiscriptor对象适配成InputStrem类型的对象形式的适配器模式,如下图所示:




查看JDK1.4的源代码我们可以看到:

Public class FileInputStream extends InputStream{
   private FileDescriptor fd;
   public FileInputStream(FileDescriptor fdObj) {
      SecurityManager security = System.getSecurityManager();
      if (fdObj == null) {
         throw new NullPointerException();
      }
      if (security != null) {
      security.checkRead(fdObj);
       }
      fd = fdObj;
  }

  public FileInputStream(File file) throws FileNotFoundException {
  String name = file.getPath();
  SecurityManager security = System.getSecurityManager();
  if (security != null) {
  security.checkRead(name);
  }
  fd = new FileDescriptor();  //对象适配器
  open(name);
  }
  //其它代码

  }

  
6.2 从byte流到char流的适配

   在Java I/O库中,使用比较频繁的要数InputStreamReader,OutputStreamWriter这两种类了,

  InputStreamReader是从byte输入流到char输入流的一个适配器。下图所示就是 InputStreamReader与Reader和InputStream等类的结构图:




  当把InputStreamReader与任何InputStream的具体子类链接的时候,可以从InputStream的输出读入byte类型的数据,将之转换成为char类型的数据,如下图所示:




查看JDK1.4的InputStreamReader源代码:

public class InputStreamReader extends Reader {
  private final StreamDecoder sd;//Adaptee对象
  public InputStreamReader(InputStream in) {
  super(in);
  try {
  sd = StreamDecoder.forInputStreamReader(in, this, (String)null); 
  } catch (UnsupportedEncodingException e) {
  // The default encoding should always be available
  throw new Error(e);
  }
  //其它代码
  }




  • 大小: 15.3 KB
  • 大小: 15.7 KB
  • 大小: 15.9 KB
  • 大小: 21 KB
  • 大小: 38.9 KB
  • 大小: 42.2 KB
  • 大小: 19.1 KB
分享到:
评论

相关推荐

    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