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,你即可以 ...
随机推荐
- java代码之美(12)---CollectionUtils工具类
java代码之美(12)---CollectionUtils工具类 这篇讲的CollectionUtils工具类是在apache下的, 而不是springframework下的CollectionUt ...
- 浅析 .Net Core中Json配置的自动更新
Pre 很早在看 Jesse 的Asp.net Core快速入门的课程的时候就了解到了在Asp .net core中,如果添加的Json配置被更改了,是支持自动重载配置的,作为一名有着严重" ...
- 搭建SpringCloud-Eureka 注册中心以及服务提供与调用
纸上得来终觉浅,绝知此事要躬行啊~果然看着很easy,自己搞起来就是各种坑~各位看官,容我慢慢道来~ 关于springcloud是什么我就不废话了~ Eureka Eureka(原来以为是缩写,原来 ...
- Android版数据结构与算法(二):基于数组的实现ArrayList源码彻底分析
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 本片我们分析基础数组的实现--ArrayList,不会分析整个集合的继承体系,这不是本系列文章重点. 源码分析都是基于"安卓版" ...
- 设计模式之桥接模式——Java语言描述
桥接适用于把抽象化和实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构性模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦 这种模式设计到一个作为桥接的接口,使得实体类的功能独立 ...
- 如何在eclipse中快速debug到想要的参数条件场景下
前言 俗话说,工欲善其事必先利其器. 对于我们经常使用的开发工具多一些了解,这也是对我们自己工作效率的一种提升. 场景 作为开发,我们经常会遇到各种bug,大部分的bug很明确,我们直接可以打断点定位 ...
- 【STM32H7教程】第2章 STM32H7的开发环境搭建
完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=86980 第2章 STM32H7的开发环境搭建 本章主要为大 ...
- vue学习笔记2
Vue.js - Day2 品牌管理案例 添加新品牌 删除品牌 根据条件筛选品牌 1.x 版本中的filterBy指令,在2.x中已经被废除: filterBy - 指令 <tr v-for=& ...
- mysql的学习笔记(一)
前言 开发中经常用mysql和SQL server交替使用,自己都产生知识的混乱.在这里重新整理下mysql的知识,也是梳理自己知识点,因为是学习笔记,所以并不会使用到图形化管理工具.mysql的安装 ...
- docker-compose-volumes的说明
docker-compose里两种设置方式都是可以持久化的 绝对路径的 ghost: image: ghost volumes: - ./ghost/config.js:/var/lib/ghost/ ...