一、什么是适配器模式:

  把一个接口变成另外一个接口,使得原本因接口不匹配无法一起工作的两个类一起工作。

二、适配器模式的分类和结构:

  适配器模式有类的适配器模式和对象的适配器模式两种。

  1、类的适配器模式:

  有时候为了使用现有的类,但是此类接口不符合需求时,需要将一个类的接口与其他类的接口进行组合,达到我们的使用需求。类的的适配器模式就是把被适配的类的API转换成目标类的API,静态结构图如下图所示:

  Target希望即使用sampieOperation1()又使用sampieOperation2(),但是很显然Adaptee并不满足要求,现在只能通过一个中间环节Adapter,继承Adaptee类,提供一个sampieOperation2()方法,满足客户端的需求,达到Target的效果。

  (1)Target(目标抽象类):所期待的接口。注意,类的适配器模式中,目标不可以是类,而是接口。

  (2)Adapter(适配器类):模式的核心类,将原接口转换成目标接口,必须是具体类。

  (3)Adaptee(适配者类):需要适配的接口。

  (4)Client(客户类):针对目标抽象类编程,调用其定义的方法。

 /**
* 达到客户端要求的目标角色
*
* @author:Zhou_DX
* @sine: 2019年3月25日 下午7:57:05
* @Description:
*/
public interface TargetClass {
/**
* 下单(源类中有的方法)
*/
public void downloaOrder(); /**
* 发货(源类中没有的方法)
*/
public void send(); }
 /**
* 源适配器
*
* @author:Zhou_DX
* @sine: 2019年3月25日 下午8:00:59
* @Description:
*/
public class AdapteeClass {
/**
* 下单(源类中有的方法)
*/
public void downloaOrder() {
System.out.println("下载订单");
}
}
 /**
* 类的适配器
*
* @author:Zhou_DX
* @sine: 2019年3月25日 下午8:02:43
* @Description:
*/
public class AdapterClass extends AdapteeClass implements TargetClass {
/**
* 发货
*/
@Override
public void send() {
// TODO Auto-generated method stub
System.out.println("发货");
}
}

  

  2.对象适配器模式:

  同样的,对象适配器也是将一个类的API转换成我们所期待的API,不同的是,类的适配器中,通过继承得到目标类,而对象适配器则是通过封装,在Adapter中封装Adaptee的一个对象,将Target与Adaptee连接起来。结构如图所示:

 /**
* 达到客户端要求的目标角色
*
* @author:Zhou_DX
* @sine: 2019年3月25日 下午7:57:05
* @Description:
*/
public interface TargetObject {
/**
* 下单(源类中有的方法)
*/
public void downloaOrder(); /**
* 发货(源类中没有的方法)
*/
public void send(); }
 /**
* 源适配器
*
* @author:Zhou_DX
* @sine: 2019年3月25日 下午8:00:59
* @Description:
*/
public class AdapteeObject {
/**
* 下单(源类中有的方法)
*/
public void downloaOrder() {
System.out.println("下载订单");
}
}
 /**
* 类的适配器
*
* @author:Zhou_DX
* @sine: 2019年3月25日 下午8:02:43
* @Description:
*/
public class AdapterObject implements TargetObject {
private AdapteeObject adapter_class; public AdapterObject(AdapteeObject adapteeClass) {
super();
this.adapter_class = adapteeClass; } /**
* 发货
*/
@Override
public void send() {
// TODO Auto-generated method stub
System.out.println("发货");
} /*
* (non-Javadoc)
*
* @see adapter_object.TargetClass#downloaOrder()
*/
@Override
public void downloaOrder() {
// TODO Auto-generated method stub
adapter_class.downloaOrder();
}
}

  对象适配器的优点:

  同一个适配器可以将源和它的子类都适配到目标接口。

三、类适配器和对象适配器的比较:

  类适配器中,适配器类通过实现Target接口并继承Adaptee类,实现适配目的。

 public class Adapter extends Adaptee implements Target
{
//request()方法为Target接口里所定义的方法
public void request()
{
specificRequest();//该方法为Adaptee类里定义的方法
}
}

  对象适配器中,适配器类通过继承Target类并关联一个Adaptee对象,实现适配目的。

 public class Adapter extends Target
{
private Adaptee adaptee;//所关联的适配者类的对象
public Adapter(Adaptee adaptee)
{
this.adaptee=adaptee;
}
public void request()
{
adaptee.specificRequest();
}
}

Java 适配器(Adapter)模式的更多相关文章

  1. 设计模式--适配器(Adapter)模式

    今天学习另一个设计模式,适配器(Adapter)模式,这是一个共同方向,但有特殊要求,就应用到此设计模式.写到这里,想起很久以前,有写过一篇<ASP.NET的适配器设计模式(Adapter)&g ...

  2. 【原】模式之-适配器Adapter模式

    适配器Adapter模式 适配器模式(Adapter Pattern)把一个类的接口变换成客户端所期待的的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 模式所涉及的角色有 ...

  3. java演示适配器(adapter)模式

    为什么要使用模式: 模式是一种做事的一种方法,也即实现某个目标的途径,或者技术. adapter模式的宗旨就是,保留现有类所提供的服务,向客户提供接口,以满足客户的需求. 类适配器:客户端定义了接口并 ...

  4. Java 实现适配器(Adapter)模式

    平时我们会常常碰到这种情况,有了两个现成的类,它们之间没有什么联系.可是我们如今既想用当中一个类的方法.同一时候也想用另外一个类的方法.有一个解决方法是.改动它们各自的接口.可是这是我们最不愿意看到的 ...

  5. java设计模式—Adapter模式

    1.核心意图:     将一个类的接口转换成客户希望的另外一个接口,从而使得原本由于接口不兼容而不能一起工作的类可以一起工作. 该模式的目标是通过一个代理(这里是Adapter),在原来的类(Adap ...

  6. 适配器(Adapter)模式

    适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的一些其他名称:变压器模式.转换器模式.包装(Wrapper)模式.适 ...

  7. 设计模式C++描述----06.适配器(Adapter)模式

    一. 定义 适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. Adapter 模式的两种类别:类模式和对象模式. 二. 举例说明 实际中 ...

  8. 2、适配器 adapter 模式 加个"适配器" 以便于复用 结构型设计模式

    1.什么是适配器模式? 适配器如同一个常见的变压器,也如同电脑的变压器和插线板之间的电源连接线,他们虽然都是3相的,但是电脑后面的插孔却不能直接插到插线板上. 如果想让额定工作电压是直流12伏特的笔记 ...

  9. 漫谈设计模式(一):代理(Proxy)模式与适配器(Adapter)模式对比

    1.前言 为什么要将代理模式与适配器模式放在一起来说呢?因为它们有许多的共同点,当然也有一些不同的地方.首先两者都是属于结构型模式.结构型模型是这样定义的: 结构型模式涉及到如何组合类和类以获得更大的 ...

  10. Adapter(适配器)模式

    1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化.  例子1:iphone4,你即可以 ...

随机推荐

  1. [dotnet] 封装一个同时支持密码/安全密钥认证的SFTP下载器,简单易用。

    前言 最近在开发订单对账系统,先从各种支付平台获取订单销售数据,然后与公司商城订单数据进行对账兜底.总体上,各个支付平台提供数据的方式分为两类,一般以接口的方式提供实时数据,比如:webservice ...

  2. Java后端框架之Spring Boot详解,文末有Java分布式实战项目视频可取

    在 Java 后端框架繁荣的今天,Spring 框架无疑是最最火热,也是必不可少的开源框架,更是稳坐 Java 后端框架的龙头老大. 用过 Spring 框架的都知道 Spring 能流行是因为它的两 ...

  3. udf提权原理详解

    0x00-前言 这个udf提权复现搞了三天,终于搞出来了.网上的教程对于初学者不太友好,以至于我一直迷迷糊糊的,走了不少弯路.下面就来总结一下我的理解. 想要知道udf提权是怎么回事,首先要先知道ud ...

  4. formidable处理node.js的post请求

    前言 我们都知道在node.js中,我们最常用的请求方式是get和post.其中get请求和URL相关,通过解析URL我们可以直接获取到请求的参数.但是post请求不同,post请求是包含在请求体中, ...

  5. 我们必须要知道的RESTful服务最佳实践

    看过很多RESTful相关的文章总结,参齐不齐,结合工作中的使用,非常有必要归纳一下关于RESTful架构方式了,RESTful只是一种架构方式的约束,给出一种约定的标准,完全严格遵守RESTful标 ...

  6. 跟踪测试 DbContext ,向"不是真正的 ORM" 说拜拜

    FreeSql 发展到现在,已经有两种稳定的开发模式,以下先简单带过一下.后面才是本文的主题. 方法一:基于 helper 的方式,祼用: dotnet add package FreeSql 提供 ...

  7. 开始在web中使用JS Modules

    本文由云+社区发表 作者: 原文:<Using JavaScript modules on the web> https://developers.google.com/web/funda ...

  8. Genymotion Android模拟器Genymotion的安装和使用

    Android模拟器Genymotion的安装和使用 by:授客 QQ:1033553122 环境: Win7 Genymotion 2.12.0 下载地址:http://download.canad ...

  9. Windows Server 2016-Windows 时间服务概览

    同步 Windows 时间服务 (W32Time) 的日期和时间的所有运行 Active Directory 域服务 (AD DS) 的计算机. 时间同步至关重要的许多 Windows 服务和的业务线 ...

  10. Open ID Connect(OIDC)在 ASP.NET Core中的应用

    我们在<ASP.NET Core项目实战的课程>第一章里面给identity server4做了一个全面的介绍和示例的练习 ,这篇文章是根据大家对OIDC遇到的一些常见问题整理得出. 本文 ...