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环境搭建指南  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  如何正确下载安装西数主机建站助手?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  如何彻底卸载建站之星软件?  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  Python文件流缓冲机制_IO性能解析【教程】  如何确保西部建站助手FTP传输的安全性?  如何为不同团队 ID 动态生成多个非值班状态按钮  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  详解jQuery中的事件  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  简单实现jsp分页  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  如何利用DOS批处理实现定时关机操作详解  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  php485函数参数是什么意思_php485各参数详细说明【介绍】  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  智能起名网站制作软件有哪些,制作logo的软件?  利用JavaScript实现拖拽改变元素大小  如何在服务器上配置二级域名建站?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  如何快速生成凡客建站的专业级图册?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  Laravel观察者模式如何使用_Laravel Model Observer配置  高端企业智能建站程序:SEO优化与响应式模板定制开发  手机软键盘弹出时影响布局的解决方法  Laravel PHP版本要求一览_Laravel各版本环境要求对照  详解Android中Activity的四大启动模式实验简述  无锡营销型网站制作公司,无锡网选车牌流程?  非常酷的网站设计制作软件,酷培ai教育官方网站?  如何挑选最适合建站的高性能VPS主机?  浅谈Javascript中的Label语句  如何在Windows虚拟主机上快速搭建网站?  如何在建站宝盒中设置产品搜索功能?  七夕网站制作视频,七夕大促活动怎么报名?  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  如何快速生成专业多端适配建站电话?  Python3.6正式版新特性预览  如何用AWS免费套餐快速搭建高效网站?  敲碗10年!Mac系列传将迎来「触控与联网」双革新  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  韩国服务器如何优化跨境访问实现高效连接?