Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比

 更新时间:2016年12月15日 11:37:58   投稿:lqh  
这篇文章主要介绍了Java 适配器模式(类适配器,对象适配器)优缺点对比的相关资料,java 适配器在基础知识中还是比较重要的,这里就说下如何使用,需要的朋友可以参考下

Java 适配器模式

           最近学习java 基础知识,学习适配器的时候疑惑很多,上网查下资料,对于 Adapter的资料很多,但是比较下本篇不错,这里记录下,大家需要的可以看下。

适配器模式就是把一个类的接口转换成客户端所期待的另外一种接口,从而使原接口不匹配而无法在一起工作的的两个类能在一起工作。从功能上说,这些接口不兼容的类一般具有相同或相似的功能。通常我们通过修改该类的接口来解决这种接口不兼容的情形,但是如果我们不愿意为了一个应用而修改各原接口,或者我们压根儿就没有对象的源代码的时候,适配器模式就会派上用场了。

适配器的优点:

1、将目标类和适配者类解耦

2、增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性

3、灵活性和扩展性都非常好,符合开闭原则

适配器所涉及的角色包括下面几种:

目标(Target):定义一个客户端使用的特定接口。

客户端(Client):使用目标接口,与和目标接口一致的对象合作。

被适配者(Adaptee):一个现存需要适配的接口。

适配器(Adapter):负责将Adaptee的接口转换为Target的接口。适配器是一个具体的类,这是该模式的核心

适配器分为类适配器和对象适配器两种,下面将详细讲述。

类适配器

所谓类适配器,指的是适配器Adapter继承我们的被适配者Adaptee,并实现目标接口Target。由于Java中是单继承,所以这个适配器仅仅只能服务于所继承的被适配者Adaptee。代码如下:

被适配者(Adaptee)

package com.bluemsun.classadapter;

public class Person {
  private int id;
  private String name;
  /**
   * person可以现在只能说英语
   */
  public void sayEnglish(){
    System.out.println("Person can say english!");
  }
  
  /**
   * 省略setter,getter.
   */
}

目标接口(Target)

package com.bluemsun.classadapter;

/**
 * 目标要求person可以说英语,法语,日语.但是现在的person仅仅可以说英语
 * @author Administrator
 *
 */
public interface Target_Person {
  void sayEnglish();
  void sayFrench();
  void sayJapanese();
}

适配器(Adapter)

package com.bluemsun.classadapter;

/**
 * 类适配器,因为继承了Person,而Java中只能单继承,所以这个适配器只为person这一个类服务
 * 这个适配器就让person类在不修改源码的基础上能实现目标接口所指定的方法
 * @author Administrator
 *
 */
public class Adapter_Person extends Person implements Target_Person{

  @Override
  public void sayFrench() {
    System.out.println("Person can say French!");
  }

  @Override
  public void sayJapanese() {
    System.out.println("Person can say Japanese!");
  }
}

客户端(Client)

package com.bluemsun.classadapter;

public class Test {
  public static void main(String[] args) {
    Target_Person person = new Adapter_Person();
    
    person.sayEnglish();
    person.sayFrench();
    person.sayJapanese();
  }
}

上面的几段简单代码演示了类适配器的作用。正如我们开始所言,这个适配器Adapter只能为Person这一个类所服务。这时候你可能会想,要是我所需要适配的类很多,是不是都需要为每一个需要适配的类写一个Adapter?有没有更加灵活的方式呢?答案是:有!就是我们下面所讲的对象适配器。

对象适配器

所谓对象适配器,简单的说就是适配器实现我们的目标接口,但是并不继承需要被适配的类。而是通过在适配器的构造函数中将需要被适配的类传递进来从而进行适配。代码如下:(Target,Adaptee同上)

适配器(Adapter)

package com.bluemsun.objectdapter;

import com.bluemsun.classadapter.Person;
import com.bluemsun.classadapter.Target_Person;

/**
 * 对象适配器,与类适配器不同的是:对象适配器可以适配多个源到目标
 * @author Administrator
 *
 */
public class Adapter_Person implements Target_Person{  //仅仅实现目标接口
  private Person person;
  
  //在构造函数中将Adaptee类Person传递进来
  public Adapter_Person(Person person){
    this.person = person;
  }

  //实现目标接口中的sayEnglish()--调用Adaptee中的sayEnglish()
  @Override
  public void sayEnglish() {
    this.person.sayEnglish();
  }

  //实现接口中的其它方法
  @Override
  public void sayFrench() {
    System.out.println("person can say French!");
  }

  @Override
  public void sayJapanese() {
    System.out.println("person can say Japanese!");
  }
}

客户端(Client)

package com.bluemsun.objectdapter;

import com.bluemsun.classadapter.Person;
import com.bluemsun.classadapter.Target_Person;

public class Test {
  public static void main(String[] args) {
    Target_Person person = new Adapter_Person(new Person());
    
    person.sayEnglish();
    person.sayFrench();
    person.sayJapanese();
  }
}

对象适配器可以适配多个带适配的类。只需要你在Adapter的构造方法中传递不同的带适配的类即可。具有灵活性。

类适配器的优点:

1、由于适配器类是适配者类的子类,因此可以再适配器类中置换一些适配者的方法,使得适配器的灵活性更强。

类适配器的缺点:

1、对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为接口,不能为类,其使用有一定的局限性,不能将一个适配者类和他的子类同时适配到目标接口。

对象适配器的优点:

1、把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和他的子类都适配到目标接口。

对象适配器的缺点:

1、与类适配器模式相比,要想置换适配者类的方法就不容易。

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • Springboot如何统一处理Filter异常

    Springboot如何统一处理Filter异常

    这篇文章主要介绍了Springboot如何统一处理Filter异常问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • java中的枚举类型详细介绍

    java中的枚举类型详细介绍

    枚举中有values方法用于按照枚举定义的顺序生成一个数组,可以用来历遍;接下来将详细介绍
    2012-11-11
  • Java Collection集合遍历运行代码实例

    Java Collection集合遍历运行代码实例

    这篇文章主要介绍了Java Collection集合遍历运行代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • java内存异常使用导致full gc频繁

    java内存异常使用导致full gc频繁

    Full GC是Java虚拟机中垃圾回收的一种方式,它会暂停应用程序所有的线程并清理整个堆内存。频繁的Full GC会导致应用程序的性能下降,甚至出现长时间的停顿。Java内存异常使用常常是Full GC频繁出现的原因之一,如使用大量的静态变量、内存泄漏等。
    2023-04-04
  • Spring+Mybatis 实现aop数据库读写分离与多数据库源配置操作

    Spring+Mybatis 实现aop数据库读写分离与多数据库源配置操作

    这篇文章主要介绍了Spring+Mybatis 实现aop数据库读写分离与多数据库源配置操作,需要的朋友可以参考下
    2017-09-09
  • Springboot2 配置AOP日志的方法步骤

    Springboot2 配置AOP日志的方法步骤

    这篇文章主要介绍了Springboot2 配置AOP日志的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • JetBrains 发布下一代 IDE无比轻量几秒就能启动干活

    JetBrains 发布下一代 IDE无比轻量几秒就能启动干活

    虽然 JetBrains 公司说 Fleet 的定位和目标并不是代替其他 IDE,但个人觉得, 如果 Fleet 火起来了,其他 IDE 就会黯然失色,特别是多语言开发者,谁愿意装多个 IDE 呢?到时候,可能 JetBrains 以后的所有 IDE 要一统江湖了
    2021-12-12
  • 教你几个 Java 编程中使用技巧

    教你几个 Java 编程中使用技巧

    枯燥的编程中总得有些乐趣,今天我们不谈论那些高深的技能,教你几个在编程中的奇技淫巧,说不定在某些时候还能炫耀一番呢,今天小编教你几个 Java 编程中使用技巧,感兴趣的朋友参考下吧
    2022-12-12
  • MyBatisPlus使用@TableField注解处理默认填充时间的问题

    MyBatisPlus使用@TableField注解处理默认填充时间的问题

    这篇文章主要介绍了MyBatisPlus使用@TableField注解处理默认填充时间的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java实现调用接口API并返回数据

    Java实现调用接口API并返回数据

    这篇文章主要介绍了Java实现调用接口API并返回数据方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05

最新评论