Java 适配器(Adapter)模式
一、什么是适配器模式:
把一个接口变成另外一个接口,使得原本因接口不匹配无法一起工作的两个类一起工作。
二、适配器模式的分类和结构:
适配器模式有类的适配器模式和对象的适配器模式两种。
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)模式的更多相关文章
- 设计模式--适配器(Adapter)模式
今天学习另一个设计模式,适配器(Adapter)模式,这是一个共同方向,但有特殊要求,就应用到此设计模式.写到这里,想起很久以前,有写过一篇<ASP.NET的适配器设计模式(Adapter)&g ...
- 【原】模式之-适配器Adapter模式
适配器Adapter模式 适配器模式(Adapter Pattern)把一个类的接口变换成客户端所期待的的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 模式所涉及的角色有 ...
- java演示适配器(adapter)模式
为什么要使用模式: 模式是一种做事的一种方法,也即实现某个目标的途径,或者技术. adapter模式的宗旨就是,保留现有类所提供的服务,向客户提供接口,以满足客户的需求. 类适配器:客户端定义了接口并 ...
- Java 实现适配器(Adapter)模式
平时我们会常常碰到这种情况,有了两个现成的类,它们之间没有什么联系.可是我们如今既想用当中一个类的方法.同一时候也想用另外一个类的方法.有一个解决方法是.改动它们各自的接口.可是这是我们最不愿意看到的 ...
- java设计模式—Adapter模式
1.核心意图: 将一个类的接口转换成客户希望的另外一个接口,从而使得原本由于接口不兼容而不能一起工作的类可以一起工作. 该模式的目标是通过一个代理(这里是Adapter),在原来的类(Adap ...
- 适配器(Adapter)模式
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的一些其他名称:变压器模式.转换器模式.包装(Wrapper)模式.适 ...
- 设计模式C++描述----06.适配器(Adapter)模式
一. 定义 适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. Adapter 模式的两种类别:类模式和对象模式. 二. 举例说明 实际中 ...
- 2、适配器 adapter 模式 加个"适配器" 以便于复用 结构型设计模式
1.什么是适配器模式? 适配器如同一个常见的变压器,也如同电脑的变压器和插线板之间的电源连接线,他们虽然都是3相的,但是电脑后面的插孔却不能直接插到插线板上. 如果想让额定工作电压是直流12伏特的笔记 ...
- 漫谈设计模式(一):代理(Proxy)模式与适配器(Adapter)模式对比
1.前言 为什么要将代理模式与适配器模式放在一起来说呢?因为它们有许多的共同点,当然也有一些不同的地方.首先两者都是属于结构型模式.结构型模型是这样定义的: 结构型模式涉及到如何组合类和类以获得更大的 ...
- Adapter(适配器)模式
1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化. 例子1:iphone4,你即可以 ...
随机推荐
- 100 天从 Python 新手到大师
Python应用领域和就业形势分析 简单的说,Python是一个“优雅”.“明确”.“简单”的编程语言. 学习曲线低,非专业人士也能上手 开源系统,拥有强大的生态圈 解释型语言,完美的平台可移植性 支 ...
- MySQL 数据库字符集 utf8 和 utf8mb4 的区别
参考于今日头条上Java芋道源码的-----记住:永远不要在 MySQL 中使用 UTF-8 字符集选择 MySQL 的 utf8 实际上不是真正的 UTF-8.utf8 只支持每个字符最多三个字节, ...
- 如何理解Axis?
前言 只有光头才能变强. 回顾前面: 从零开始学TensorFlow[01-搭建环境.HelloWorld篇] 什么是TensorFlow? TensorFlow读写数据 不知道大家最开始接触到axi ...
- 最快1天搭建短视频APP!阿里云短视频解决方案上线
短视频行业的发展前景乐观是毋庸置疑的,整个短视频的市场规模一直在增长,网络数据显示2018年已经突破100亿大关,在2019年预测将超过200亿.那么,对于短视频从业者来讲,要持续推动业务的发展,必须 ...
- SQL优化 MySQL版 - B树索引详讲
SQL优化 MySQL版 - -B树索引详讲 作者:Stanley 罗昊 [转载请注明出处和署名,谢谢!] 为什么要进行SQL优化呢?很显然,当我们去写sql语句时: 1会发现性能低 2.执行时间太 ...
- VS2017、VS2019没有Setup安装项目(Visual Studio Installer)_解决方案
前言: VS2010中有一个自带的安装部署项目,叫:Visual Studio Installer ,我们通常称为:setup项目,是一个用于自定义安装部署的项目方案.但是在VS2017,VS2019 ...
- 在做关于NIO TCP编程小案例时遇到无法监听write的问题,没想到只是我的if语句的位置放错了位置,哎,看了半天没看出来
在做关于NIO TCP编程小案例时遇到无法监听write的问题,没想到只是我的if语句的位置放错了位置,哎,看了半天没看出来 贴下课堂笔记: 在Java中使用NIO进行网络TCP套接字编程主要以下几个 ...
- MongoDB通过Shell 实现集合的日常归档
1.MongoDB数据归档的意义 和其他类型的数据库一样,归档对MongoDB同样重要.通过归档,可以保持集合中合适的数据量,对数据库的性能是一种保障,也就是大家常说的数据冷热分离. 同时,归档对数据 ...
- windows之如何把文件夹转换成iso文件
(1)oscdimg下载路径: 链接:https://pan.baidu.com/s/1U_SfamsOvI2nav9odAzujQ提取码:21fr (2)以管理员身份运行cmd命令: Oscdimg ...
- Exp5 Msf基础应用 20164312 马孝涛
1.本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.1一个主动攻击实践,如ms08_067; (1分) 1.2 一个针对浏览器的攻击,如ms11_ ...