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

发布时间 - 2026-01-10 21:50:54    点击率:

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、与类适配器模式相比,要想置换适配者类的方法就不容易。

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


# Java  # 适配器模式  # 适配器模式对比  # Adapter  # 类与对象的对比  # 剖析Java中的事件处理与异常处理机制  # Java经典设计模式之适配器模式原理与用法详解  # 详解JAVA Spring 中的事件机制  # Java事件处理机制和适配器全面解析  # 客户端  # 多个  # 子类  # 英语  # 能为  # 这一  # 可以说  # 类中  # 复用  # 的是  # 不兼容  # 是一个  # 这是  # 法语  # 就会  # 日语  # 的说  # 就不  # 你在  # 两种 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 微信小程序 闭包写法详细介绍  郑州企业网站制作公司,郑州招聘网站有哪些?  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  如何选择可靠的免备案建站服务器?  原生JS实现图片轮播切换效果  微信h5制作网站有哪些,免费微信H5页面制作工具?  如何在橙子建站上传落地页?操作指南详解  详解Huffman编码算法之Java实现  nginx修改上传文件大小限制的方法  如何续费美橙建站之星域名及服务?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  北京网站制作公司哪家好一点,北京租房网站有哪些?  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  如何破解联通资金短缺导致的基站建设难题?  Laravel如何实现API版本控制_Laravel版本化API设计方案  微信公众帐号开发教程之图文消息全攻略  JS中对数组元素进行增删改移的方法总结  如何在腾讯云服务器快速搭建个人网站?  微信小程序 scroll-view组件实现列表页实例代码  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  Android滚轮选择时间控件使用详解  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  HTML 中如何正确使用模板变量为元素的 name 属性赋值  如何快速配置高效服务器建站软件?  如何自定义建站之星网站的导航菜单样式?  长沙企业网站制作哪家好,长沙水业集团官方网站?  如何实现javascript表单验证_正则表达式有哪些实用技巧  *服务器网站为何频现安全漏洞?  如何快速选择适合个人网站的云服务器配置?  Laravel如何实现用户注册和登录?(Auth脚手架指南)  Laravel如何使用Service Container和依赖注入?(代码示例)  Android自定义listview布局实现上拉加载下拉刷新功能  Java遍历集合的三种方式  javascript基于原型链的继承及call和apply函数用法分析  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  Laravel如何使用Blade模板引擎?(完整语法和示例)  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  JavaScript Ajax实现异步通信  如何在IIS7中新建站点?详细步骤解析  python中快速进行多个字符替换的方法小结  高端建站三要素:定制模板、企业官网与响应式设计优化  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  智能起名网站制作软件有哪些,制作logo的软件?