一、什么是适配器模式:

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

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

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

  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. dev和master合并冲突解决

    前景 master主分支,dev是开发分支,master会保持最新的dev代码 问题的产生 dev开发新功能 版本发布,dev合并到了master,发布生产环境 新需求来了,在dev进行开发 同时,线 ...

  2. jdk源码阅读笔记-Integer

    public final class Integer extends Number implements Comparable<Integer> Integer 由final修饰了,所以该 ...

  3. 干货|一个案例学会Spring Security 中使用 JWT

    在前后端分离的项目中,登录策略也有不少,不过 JWT 算是目前比较流行的一种解决方案了,本文就和大家来分享一下如何将 Spring Security 和 JWT 结合在一起使用,进而实现前后端分离时的 ...

  4. JAVA匿名内部类(Anonymous Classes)

    1.前言 匿名内部类在我们JAVA程序员的日常工作中经常要用到,但是很多时候也只是照本宣科地用,虽然也在用,但往往忽略了以下几点:为什么能这么用?匿名内部类的语法是怎样的?有哪些限制?因此,最近,我在 ...

  5. RabbitMQ死信队列另类用法之复合死信

    前言 在业务开发过程中,我们常常需要做一些定时任务,这些任务一般用来做监控或者清理任务,比如在订单的业务场景中,用户在创建订单后一段时间内,没有完成支付,系统将自动取消该订单,并将库存返回到商品中,又 ...

  6. Asp.NetCore轻松学-部署到 IIS 进行托管

    前言 经过一段时间的学习,终于来到了部署服务这个环节,.NetCore 的部署方式非常的灵活多样,但是其万变不离其宗,所有的 Asp.NetCore 程序都基于端口的侦听,在部署的时候仅需要配置侦听地 ...

  7. WPF TextBox 正则验证 大于等于0 小于等于1 的两位小数

    正则:^(0\.\d+|[1-9][0-9]|1)$ TextBox绑定正则验证 <TextBox x:Name="txb"   MaxLength="6" ...

  8. Hystix熔断解决雪崩问题

    1.线程隔离,服务降级(服务的消费方做降级处理) 当服务繁忙时,如果服务出现异常,不是粗暴的直接报错,而是返回一个友好的提示,虽然拒绝了用户的访问,但是会返回一个结果. 这就好比去买鱼,平常超市买鱼会 ...

  9. 【swoole】如何在docker+swoole环境下测试udp服务

    前面几篇文章讲了使用 docker+swoole 环境来测试tcp服务以及如何测试,但是当我开始学习udp服务那块的时候,发现使用原来的方式在 docker+swoole 环境下行不通啦,后来发现如果 ...

  10. 我们是如何通过全球第一免费开源ERP Odoo做到项目100%交付

    传统友商ERP的交付过程 一.先初步需求调研,后选型功能模块 传统友商ERP第一件事情先对客户方进行初步的调研,客户方无论说什么,友商听过算过,只关心你人数多少,有哪些人涉及到哪些模块,接着对模块进行 ...