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

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

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 对适配器原有接口方法的调用被委托给新接口的实例的特定方法

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

时间: 2016-05-09

java设计模式笔记之适配器模式

适配器(Adapter)模式: 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 生活中的场景: 1.笔记本电源适配器,可以将220v转化为适合笔记本使用的电压. 2.给笔记本电脑的usb接口插入台式机的ps/2接口的键盘,需要一个usb和ps/2的接口转接器,此时usb和ps/2的接口转接器就充当了适配器的角色. 通用类图: 在上面的通用类图中,Cient 类最终面对的是 Target 接口(或抽象类),它只能够使用符合这一

初识Java设计模式适配器模式

[正文] 我们知道,Android中最重要也是最难用的UI控件就是ListView列表控件,而要想灵活运用它,则必须要用到适配器adapter,所以,我觉得还是很有必要来学习一下Java当中的适配器模式(不管以后能不能用到),毕竟Java语言是Android开发很重要的一个基础. 完全了解适配器模式,有很多知识要学习,例如:适配器模式有类的适配器模式和对象的适配器模式两种不同的形式.但作为初学者,我就简单学习一下配器模式入门知识吧,以后会不断完善.希望奋斗在码农路上的童鞋们莫吐槽→_→ 一.适配

java设计模式之适配器模式

感谢<Android源码设计模式解析与实战> 何红辉 关爱民 著 适配器模式在我们的开发中使用率极高,从代码中随处可见的Adapter就可以判断出来,从最早的ListView.GridView.到现在最新的RecyclerView都需要使用Adapter,并且在开发中我们遇到的优化问题.出错概率较大的地方也基本都出自Adapter. 适配器是将两个不兼容的火龙融合在一起,将不同的东西通过一种转换使得它们能够协作起来,例如,经常碰到要在两个没有关系的类型之间进行交互,第一个解决方案是修改各自类的

Java设计模式之适配器模式简介

本文举例说明两种适配器模式,即类适配模式和对象适配模式,详情如下: 1.类适配模式: 举个例子来说明:在地球时代,所有坐骑都是只能跑,不能飞的,而现在很多坐骑在地球都可以飞了.假设,地球时代的坐骑只能跑,而现在的坐骑不仅能飞还能跑,我们可以用类适配模式来实现. 这里需要注意的是,适配器继承源类,实现目标接口. 示例代码如下: package adapter; /** * DOC 源 * */ public class Sources { public void run() { System.ou

java设计模式之适配器模式(Adapter)

概述 将一个类的接口转换成用户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 两种实现方式 1.类的适配器模式: 2.对象的适配器模式: 类的适配器模式的UML图,如下: 类的适配器模式把适配的类的API转换成为目标类的API. 上图设计的角色有: 目标角色(Target):这就是所期待得到的接口. 源角色(Adapee):现在需要适配的接口. 适配器角色(Adapter):是本模式的核心,适配器把源接口转换成目标接口. 代码示例: inter

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

Java 适配器模式 最近学习java 基础知识,学习适配器的时候疑惑很多,上网查下资料,对于 Adapter的资料很多,但是比较下本篇不错,这里记录下,大家需要的可以看下. 适配器模式就是把一个类的接口转换成客户端所期待的另外一种接口,从而使原接口不匹配而无法在一起工作的的两个类能在一起工作.从功能上说,这些接口不兼容的类一般具有相同或相似的功能.通常我们通过修改该类的接口来解决这种接口不兼容的情形,但是如果我们不愿意为了一个应用而修改各原接口,或者我们压根儿就没有对象的源代码的时候,适配器模

Java设计模式之适配器模式(Adapter模式)介绍

适配器模式定义:将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份. 为何使用适配器模式 我们经常碰到要将两个没有关系的类组合在一起使用,第一解决方案是:修改各自类的接口,但是如果我们没有源代码,或者,我们不愿意为了一个应用而修改各自的接口. 怎么办? 使用Adapter,在这两种接口之间创建一个混合接口(混血儿). 如何使用适配器模式 实现Adapter方式,其实"think in Java"的"类再生&quo

轻松掌握Java适配器模式

在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的.一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中. 特点:将两个不兼容的类通过接口实现在一起工作 企业级开发和常用框架中的应用:流接口,例如将字符流转换为字节流输出是用的outputstreamreader 适配器模式分为类适配器和对象适配器: 举例:电脑只有USB接口,但是键盘只有圆口,这时就需要一个适配器,让键盘能输入数据到电脑 类适配器: pac

Java适配器模式定义与用法示例

本文实例讲述了Java适配器模式定义与用法.分享给大家供大家参考,具体如下: 将一个类的接口转换成客户想要的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 适配器一共包括3种角色 1.目标:目标是一个接口,该接口是客户想使用的接口 2.被适配者:被适配者是一个已存在的接口或抽象类,这个接口或抽象类需要适配 3.适配器:适配器是一个类,该类实现了目标接口并包含有被适配者的引用,即适配者的指着是对被适配者接口与目标进行适配 package org.zhy.adapte

Java结构型设计模式中的适配器模式与桥接模式解析

适配器模式 定义 适配器模式(英语:adapter pattern)有时候也称包装样式或者包装.将一个类的接口转接成用户所期待的.一个适配使得因接口不兼容而不能在一起工作的类工作在一起. 有两类适配器模式: 1. 对象适配器模式 - 对象适配器通过关联满足用户期待接口,还降低了代码间的不良耦合.在工作中推荐使用"对象适配". 2. 类适配器模式 - 这种适配器模式下,适配器继承自已实现的类(一般多重继承),java中没有多重继承,所以这里不做介绍. 实现 1. Target - 定义C

深入解析设计模式中的适配器模式在C++中的运用

适配器模式属于结构型的设计模式,它是结构型设计模式之首(用的最多的结构型设计模式). 适配器设计模式也并不复杂,适配器它是主要作用是将一个类的接口转换成客户希望的另外一个接口这样使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.适配器模式有两种:1.类的适配器 2.对象适配器,对象适配器更多一些. 示例:比如你在网上买了一个手机,但是买家给你发回来了一个3接头的充电器,但是恰好你又没有3接头的插槽,只有2个接口的插槽,于是你很直然地便会想到去找你个3接口转两接口的转换器.简单的分析下这个

详解JavaScript实现设计模式中的适配器模式的方法

有的时候在开发过程中,我们会发现,客户端需要的接口和提供的接口发生不兼容的问题.由于特殊的原因我们无法修改客户端接口.在这种情况下,我们需要适配现有接口和不兼容的类,这就要提到适配器模式.通过适配器,我们可以在不用修改旧代码的情况下也能使用它们,这就是适配器的能力. 适配模式可用来在现有接口和不兼容的类之间进行适配,使用这种模式的对象又叫包装器(wrapper),因为它们是在用一个新的接口包装另一个对象. 从表面上看,适配器模式很像外观模式.它们都要对别的对象进行包装并改变其呈现的接口.二者的差

Java设计模式之Adapter适配器模式

一.场景描述 "仪器数据采集器"包含采集数据以及发送数据给服务器两行为,则可定义"仪器数据采集器"接口,定义两方法"采集数据capture"和"发送数据sendData". "PDF文件数据采集器"实现时,要实现"仪器数据采集器"接口,实现"采集数据"方法:目前有"PDF文件内容解析工具"类PdfFileExtractor,该类实现PDF文件的数据

C++设计模式编程中使用Bridge桥接模式的完全攻略

桥接模式将抽象(Abstraction)与实现(Implementation)分离,使得二者可以独立地变化. 桥接模式典型的结构图为: 在桥接模式的结构图中可以看到,系统被分为两个相对独立的部分,左边是抽象部分,右边是实现部分,这两个部分可以互相独立地进行修改:例如上面问题中的客户需求变化,当用户需求需要从 Abstraction 派生一个具体子类时候,并不需要像上面通过继承方式实现时候需要添加子类 A1 和 A2 了.另外当上面问题中由于算法添加也只用改变右边实现(添加一个具体化子类),而右边

简单了解C#设计模式编程中的桥接模式

桥接模式的概念 定义:将抽象部分与实现部分分离,使它们都可以独立的变化. 理解:为啦解决一个对象变化而影响多个对象跟着变化,需要把具体实现对象抽象化,使降低对象和变化因素的耦合度,提高系统的可维护性和扩展性. 举例: 手机系统的生态圈问题: 啰嗦点:众所周知wp的生态圈相对与有些系统较差,各位需努力,诺基亚走下神坛,wp要走上神坛,顶一下哈. wp/ios系统类:运行软件,可承载本运行环境下的任何软件,如果新增一个系统,软件就要多做一个系统的版本 weixin/kuwo软件类:开始运行软件,如果

Java 中桥接模式——对象结构型模式的实例详解

Java  中桥接模式--对象结构型模式的实例详解 一.意图 将抽象部分与它的实现部分分离,使他们都可以独立的变化. 二.适用性 以下一些情况使用Bridge模式 你不希望在抽象和它的实现部分之间有一个固定的绑定关系.例如这种情况可能因为,在程序运行时刻实现部分应可以被选择或者切换. 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充.这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对他们进行扩充. 对一个抽象的实现部分的修改应对客户不产生影响,即客户代码不必重新编译

详解Java设计模式编程中的Flyweight享元模式的开发结构

享元(Flyweight)模式:通过共享技术以便有效的支持大量细粒度的对象. 享元模式在阎宏的<java与模式>中分为单纯享元模式和复合享元模式,复合模式的复合享元是不可以共享的,享元对象能做到共享的关键是区分内蕴态(Internal State)和外蕴态( External State).这两个"蕴态"翻译的太难懂,我不是说翻译的不好,可能是我理解能力差,还是<Design Pattern Elements of Reusable Object-Oriented S