Java适配器模式_动力节点Java学院整理

 更新时间:2017年07月24日 11:07:09   作者:zy  
这篇文章主要介绍了Java适配器模式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

一.概念

适配器模式将一个接口转换成客户希望的另外一个接口。它使得原来由于接口不兼容而不能在一起工作的那些类可以一起工作。

二.UML

 

三.更加生动的例子

四.实例分析

去年买了一个本本,另外给本本配了罗技G1光电套。坑爹的是,光电套的鼠标是USB接口,键盘是PS2接口,可我的本本却没有PS2接口啊。于是跑到市场,淘了一个转接器。

于是乎,我抽象了这么几个类。

1.PS2Port(PS2接口)。

2.USBPort(USB接口)。

3.PS2ToUSB(对象适配器),将PS2接口装换成USB接口。

4.TestAdapter(测试类),客户端。

PS2Port  

package com.bjpowernode.adapter; 
 
/** 
 * PS2接口,圆口 
 * @author eason 
 * 
 */ 
public interface PS2Port { 
  public void workWithPS2(); 
} 

 USBPort

package com.bjpowernode.adapter; 
 
/** 
 * USB接口,U口 
 * @author eason 
 * 
 */ 
public interface USBPort { 
  public void workWithUSB(); 
} 
 

PS2ToUSB

package com.bjpowernode.adapter; 
 
/** 
 * 对象适配器 
 * 将PS2接口装换成USB接口 
 * 所以此类类型是USB接口(implements USBPort) + 成员变量ps2Port 
 * @author eason 
 * 
 */ 
public class PS2ToUSB implements USBPort{ 
 
  private PS2Port ps2Port; 
   
  public PS2ToUSB(PS2Port ps2Port) { 
    this.ps2Port = ps2Port; 
  } 
   
  @Override 
  public void workWithUSB() { 
    System.out.println("转换的关键在这里,本来是"); 
    ps2Port.workWithPS2(); 
    System.out.println("经过你的转换,现在是USB工作中"); 
  } 
   
} 
 

TestAdapter

package com.bjpowernode.adapter; 
 
/** 
 * 测试类 
 * client 
 * @author eason 
 * 
 */ 
public class TestAdapter { 
 
  public static void main(String[] args) { 
    //我现在有一个PS2接口 
    PS2Port ps2Port = new PS2Port() { 
      @Override 
      public void workWithPS2() { 
        System.out.println("PS2工作中"); 
      } 
    }; 
     
    //但是我需要的是一个USB接口啊,对我(client)来说,我只认识USB接口 
    //经过PS2ToUSB的转换,PS2接口变成了USB接口 
    USBPort ps2ToUsbPort = new PS2ToUSB(ps2Port); 
     
    ps2ToUsbPort.workWithUSB(); 
     
  } 
 
} 

五.对象的适配器和类的适配器

上述的适配器就是对象适配器。再看看类适配器。

PS2ToUSB,只是简单模拟一下。因为java不允许多继承,所以java中没有类模式的代码,只有思想。

package com.bjpowernode.adapter; 
 
/** 
 * 类适配器 
 * @author eason 
 * 
 */ 
public class PS2ToUSB implements USBPort, PS2Port{ 
 
  //重写workWithUSB,把工作交给workWithPS2 
  @Override 
  public void workWithUSB() { 
    workWithPS2(); 
  } 
   
} 

差别就是:对象适配器实现了客户端想要的接口(USB),在内部有一个被适配对象(PS2)的引用,通过组合实现适配功能。类适配器实现了客户端想要的接口(USB)和被适配对象接口(PS2),通过继承来实现适配功能。

六.使用场景及使用感受

1.希望复用一些现存的类,但是接口又与复用环境要求不一致。

2.其实适配器模式有点无奈之举,在前期设计的时候,我们就不应该考虑适配器模式,而应该考虑通过重构统一接口。

七.适配器模式与装饰者模式

它们都可以用来包装对象,本质区别在于

1.适配器模式:将一个接口转换成另外一个接口。

2.装饰者模式:不改变接口,只加入职责。

相关文章

  • Spring AOP与代理类的执行顺序级别浅析

    Spring AOP与代理类的执行顺序级别浅析

    这篇文章主要介绍了Spring AOP与代理类的执行顺序级别,关于 Spring AOP和Aspectj的关系,两个都实现了切面编程,Spring AOP更多地是为了Spring框架本身服务的,而Aspectj具有更强大、更完善的切面功能
    2023-03-03
  • Elasticsearch 自动重启脚本创建实现

    Elasticsearch 自动重启脚本创建实现

    这篇文章主要为大家介绍了Elasticsearch 自动重启脚本创建实现详解分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 在SpringBoot项目中实现给所有请求加固定前缀

    在SpringBoot项目中实现给所有请求加固定前缀

    这篇文章主要介绍了在SpringBoot项目中实现给所有请求加固定前缀,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java 精炼解读数据结构的顺序表如何操作

    Java 精炼解读数据结构的顺序表如何操作

    程序中经常需要将一组数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传进传出函数等。一组数据中包含的元素个数可能发生变化,顺序表则是将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示
    2022-03-03
  • SpringCloud HystrixDashboard服务监控详解

    SpringCloud HystrixDashboard服务监控详解

    Hystrix Dashboard 是Spring Cloud中查看Hystrix实例执行情况的一种仪表盘组件,支持查看单个实例和查看集群实例,本文将对其服务监控学习
    2022-11-11
  • 基于SpringBoot + Redis实现密码暴力破解防护

    基于SpringBoot + Redis实现密码暴力破解防护

    在现代应用程序中,保护用户密码的安全性是至关重要的,密码暴力破解是指通过尝试多个密码组合来非法获取用户账户的密码,为了保护用户密码不被暴力破解,我们可以使用Spring Boot和Redis来实现一些防护措施,本文将介绍如何利用这些技术来防止密码暴力破解攻击
    2023-06-06
  • 一文带你掌握Java8中Lambda表达式 函数式接口及方法构造器数组的引用

    一文带你掌握Java8中Lambda表达式 函数式接口及方法构造器数组的引用

    Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等
    2021-10-10
  • 详解Java设计模式之桥接模式

    详解Java设计模式之桥接模式

    桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯。桥接模式将系统的抽象部分与实现部分分离解耦,使他们可以独立的变化。本文通过示例详细介绍了桥接模式的原理与使用,需要的可以参考一下
    2022-06-06
  • Java8接口默认静态方法及重复注解原理解析

    Java8接口默认静态方法及重复注解原理解析

    这篇文章主要介绍了Java8接口默认静态方法及重复注解原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • 详解MyBatis特性之动态SQL

    详解MyBatis特性之动态SQL

    动态 SQL 是 MyBatis 的强大特性之一,这篇文章我们将结合动态SQL完成更加复杂的 SQL 操作,文章通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01

最新评论