实例解析Java设计模式编程中的适配器模式使用

 更新时间:2017年04月19日 10:23:20   投稿:wbb  
本篇文章主要通过实例对适配器模式进行了详解,需要的朋友可以参考下

适配器模式的主要作用是在新接口和老接口之间进行适配,通过将一个类的接口转换成客户期望的另一个接口,让原本不兼容的接口可以合作无间,本文以实例解析Java设计模式编程中的适配器模式使用,需要的朋友可以参考下

平时我们会经常碰到这样的情况,有了两个现成的类,它们之间没有什么联系,但是我们现在既想用其中一个类的方法,同时也想用另外一个类的方法。有一个解决方法是,修改它们各自的接口,但是这是我们最不愿意看到的。这个时候Adapter模式就会派上用场了。

p style="margin: 0px; padding: 5px 0px;"> Adapter模式也叫适配器模式,是由GoF提出的23种设计模式的一种。Adapter模式是构造型模式之一,通过Adapter模式,可以改变已有类(或外部类)的接口形式。

适配器 模式 有三种方式,一种是对象适配器,一种是类适配器, 一种是接口适配器

以下举例说明:

1.类适配器

public class DrawRectangle {//画方 
 public void drawRectangle(String msg) { 
  System.out.println("draw Rectangle: " + msg); 
 } 
} 
public interface IDrawCircle {//画圆的接口 
 void drawCircle(); 
} 
/** 
 * 类适配器 使用对象继承的方式,是静态的定义方式 
 * @author stone 
 * 
 */
public class DrawAdapter4Class extends DrawRectangle implements IDrawCircle {//既能画方又能画圆 
 @Override
 public void drawCircle() { 
  System.out.println("DrawAdapter4Class: drawCircle"); 
 }   
}

2.对象适配器

/** 
 * 对象适配器: 使用对象组合的方式,是动态组合的方式。 
 * 既能画方又能画圆 
 * @author stone 
 * DrawAdapter是适配器,DrawRectangle属于adapter,是被适配者,适配器将被适配者和适配目标(DrawCircle)进行适配 
 * 
 */
public class DrawAdapter4Object implements IDrawCircle {//既能画方又能画圆  
 private DrawRectangle drawRectangle; 
 public DrawAdapter4Object(DrawRectangle drawRectangle) { 
  this.drawRectangle = drawRectangle; 
 }  
 @Override
 public void drawCircle() { 
  System.out.println("DrawAdapter4Object: drawcircle"); 
 }   
 public void drawRectangle(String msg) { 
  drawRectangle.drawRectangle(msg); 
 }   
} 

3.接口适配器

/* 
 * 接口适配器:接口中有抽象方法,我们只想实现其中的几个,不想全部实现, 
 * 所以提供一个默认空实现,然后继承自它,重写实现我们想实现的方法 
 */
public interface IDraw { 
 void drawCircle(); 
 void drawRectangle(); 
} 
/* 
 * 接口适配器 的默认实现 
 */
public class DefaultDrawAdapter implements IDraw {//画方 画圆 皆为空实现 
 @Override
 public void drawCircle() { 
 } 
 @Override
 public void drawRectangle() { 
public class Test { 
 public static void main(String[] args) { 
  //对象适配器 
  DrawAdapter4Object objAdapter = new DrawAdapter4Object(new DrawRectangle()); 
  objAdapter.drawCircle(); 
  objAdapter.drawRectangle(" in DrawAdapter4Object"); 
  System.out.println("--------------");    
  //类适配器 
  DrawAdapter4Class clzAdapter = new DrawAdapter4Class(); 
  clzAdapter.drawCircle(); 
  clzAdapter.drawRectangle("in DrawAdapter4Class");  
  System.out.println("--------------"); 
  //接口适配器 
  MyDrawAdapter myDrawAdapter = new MyDrawAdapter(); 
  myDrawAdapter.drawCircle(); 
  myDrawAdapter.drawRectangle(); 
 } 
 static class MyDrawAdapter extends DefaultDrawAdapter { 
  @Override
  public void drawCircle() { 
   System.out.println("drawCircle in MyDrawAdapter"); 
  } 
   
 } 
}

打印

DrawAdapter4Object: drawcircle 
draw Rectangle: in DrawAdapter4Object 
-------------- 
DrawAdapter4Class: drawCircle 
draw Rectangle: in DrawAdapter4Class 
-------------- 
drawCircle in MyDrawAdapter 

适配器模式的三个特点:

1 适配器对象实现原有接口

2 适配器对象组合一个实现新接口的对象(这个对象也可以不实现一个接口,只是一个单纯的对象)

3 对适配器原有接口方法的调用被委托给新接口的实例的特定方法

有人认为讲解设计模式的例子都太简单,看着感觉是那么回事,但是要是真想在项目开发中使用,还真是应用不到。其实我们不必在项目中刻意使用设计模式,而是应该从实际的设计问题出发,看哪个模式能解决我们的问题,就使用哪个模式。不要为了使用模式而使用模式,那样就舍本逐末了,一般情况下,只要遵循一定的设计原则就可以了,设计模式也是根据这些原则被总结出来的,熟悉了这些原则,模式自然而然就有了。

希望本篇文章对您有所帮助

相关文章

  • 详解ThreadLocal为什么会内存溢出原理

    详解ThreadLocal为什么会内存溢出原理

    这篇文章主要为大家介绍了ThreadLocal为什么会内存溢出原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Spring中实现定时调度的几种方法

    Spring中实现定时调度的几种方法

    本篇文章主要介绍了Spring中实现定时调度示例,可以在无人值守的时候系统可以在某一时刻执行某些特定的功能,有兴趣的可以了解一下。
    2017-02-02
  • RestTemplate上传、下载文件实例代码

    RestTemplate上传、下载文件实例代码

    介绍了文件上传和下载的基本方法,包括处理本地文件和文件流,上传时区分了文件是否在本地,下载时强调返回值为byte[],并提供了工具类进行进一步处理
    2025-02-02
  • Java 数据结构之删除链表中重复的结点

    Java 数据结构之删除链表中重复的结点

    在一个排序的链表中,会存在重复的结点,如何实现删除该链表中重复的结点,重复的结点不保留,并返回链表头指针呢?接下来小编将带你详细介绍
    2021-12-12
  • Java使用POI导出大数据量Excel的方法

    Java使用POI导出大数据量Excel的方法

    今天需要写一个导出的Excel的功能,但是发现当数据量到3万条时,列数在23列时,内存溢出,CPU使用100%,测试环境直接炸掉。小编给大家分享基于java使用POI导出大数据量Excel的方法,感兴趣的朋友一起看看吧
    2019-11-11
  • SpringBoot+VUE实现数据表格的实战

    SpringBoot+VUE实现数据表格的实战

    本文将使用VUE+SpringBoot+MybatisPlus,以前后端分离的形式来实现数据表格在前端的渲染,具有一定的参考价值,感兴趣的可以了解一下
    2021-08-08
  • Struts1教程之ActionMapping_动力节点Java学院整理

    Struts1教程之ActionMapping_动力节点Java学院整理

    这篇文章主要介绍了Struts1教程之ActionMapping,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Spring Boot使用Druid连接池的示例代码

    Spring Boot使用Druid连接池的示例代码

    Druid是Java语言中最好的数据库连接池。这篇文章主要介绍了Spring Boot使用Druid连接池的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • Java Springboot异步执行事件监听和处理实例

    Java Springboot异步执行事件监听和处理实例

    Java SpringBoot中,监听和处理事件是一种常见的模式,它允许不同的组件之间通过事件进行通信,事件监听和处理通常通过Spring的事件发布-订阅模型来实现,一个简单的Spring Boot应用程序示例,其中将包括事件的定义、事件的发布以及事件的监听
    2024-07-07
  • SpringBoot下使用自定义监听事件的流程分析

    SpringBoot下使用自定义监听事件的流程分析

    事件机制是Spring的一个功能,目前我们使用了SpringBoot框架,所以记录下事件机制在SpringBoot框架下的使用,同时实现异步处理,这篇文章主要介绍了SpringBoot下使用自定义监听事件,需要的朋友可以参考下
    2023-08-08

最新评论