003-结构型-01-适配器模式(Adapter)
一、概述
将一个类的接口转换成客户期望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作。
1.1、适用场景
已经存在的类,它的方法和需求不匹配时(方法结果相同或相似)
不是软件设计阶段考虑的设计模式,是随着软件维护。由于不同产品、不同厂家造成功能类似而接口不相同情况下的解决方案
类的适配器模式:当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可。
对象的适配器模式:当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Wrapper类,持有原类的一个实例,在Wrapper类的方法中,调用实例的方法就行。
接口的适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个抽象类Wrapper,实现所有方法,我们写别的类的时候,继承抽象类即可。
1.2、优缺点
优点:
- 能提高类的透明性和复用,现有的类复用但不需要改变
- 目标类和适配器类解耦,提高程序扩展性
- 符合开闭原则
缺点:
- 适配器编写过程需要全面考虑,可能会增加系统的复杂性
- 增加系统代码可读的难度
1.3、类图角色及其职责
适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。
1.3.1、类适配:创建新类,继承原类,并实现新接口,例如

让Adapter继承Adaptee类,Client在使用Target的request()接口(实际上是调用Adapter的request()方法)时,间接调用adapteeRequest()方法。
class Adaptee{
void adapteeRequest(){
System.out.println("com.github.bjlhx15.patterns.base.structure.adapter.Adaptee.adapteeRequest");
}
}
interface Target{
void request();
}
public class Adapter extends Adaptee implements Target{
@Override
public void request() {
System.out.println("com.github.bjlhx15.patterns.base.structure.adapter.Adapter.request");
this.adapteeRequest();
}
}
测试
@Test
public void request() {
Target target = new Adapter();
target.request();
}
上述类图

1.3.2、对象适配:创建新类持源类的实例,并实现新接口,例如

对比着类适配器理解。在Adapter内部创建Adaptee对象,Client在使用Target的request()接口(实际上是调用Adapter的request()方法)时,间接调用adapteeRequest()方法。
class Adaptee2{
void adapteeRequest2(){
System.out.println("com.github.bjlhx15.patterns.base.structure.adapter.Adaptere2.adapteeRequest2");
}
}
interface Target2{
void request();
}
public class Adapter2 implements Target2 {
private Adaptee2 adaptee2;
public Adapter2(Adaptee2 adaptee2) {
this.adaptee2 = adaptee2;
}
@Override
public void request() {
System.out.println("com.github.bjlhx15.patterns.base.structure.adapter.Adapter2.request");
adaptee2.adapteeRequest2();
}
}
测试
@Test
public void request() {
Target2 target2 = new Adapter2(new Adaptee2());
target2.request();
}
上述类图

适配器模式包含一下三个角色:
Target(目标抽象类):目标抽象类定义客户所需的接口,可以是一个抽象类或接口,也可以是具体类。在类适配器中,由于Java语言不支持多重继承,所以它很可能是接口。
Adapter(适配器类):它可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配。它是适配器模式的核心。
Adaptee(被适配类):被适配类即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类包好了客户希望的业务方法。
1.3.3、接口的适配器模式
有时我们写的一个接口中有多个抽象方法,当我们写该接口的实现类时,必须实现该接口的所有方法,这明显有时比较浪费,因为并不是所有的方法都是我们需要的,有时只需要某一些,此处为了解决这个问题,我们引入了接口的适配器模式,借助于一个抽象类,该抽象类实现了该接口,实现了所有的方法,而我们不和原始的接口打交道,只和该抽象类取得联系,所以我们写一个类,继承该抽象类,重写我们需要的方法就行。

1.4、演进过程
二、扩展
扩展-JDK1.7以及框架源码中的适配器模式
javax.xml.bind.annotation.adapters.XmlAdapter
org.springframework.aop.framework.adapter.AdvisorAdapter、MethodBeforeAdviceAdapter
org.springframework.orm.jpa.JpaVendorAdapter
org.springframework.web.servlet.HandlerAdapter、org.springframework.web.servlet.DispatcherServlet、org.springframework.web.servlet.mvc.Controller
2.1、分析org.springframework.web.servlet.HandlerAdapter
类图

2.1、分析org.springframework.web.servlet.mvc.Controller
类图

003-结构型-01-适配器模式(Adapter)的更多相关文章
- [19/04/25-星期四] GOF23_结构型模式(适配器模式、代理模式)
一.引言 结构模式:核心作用就是从程序的结构上实现松耦合,从而扩大整体的类结构,用来解决更大的问题. 二.适配器模式(adapter) 生活中假设笔记本是标准的USB接口但是外置键盘是圆形接口,这时候 ...
- 【设计模式】【最后一个】结构型07适配器模式(Adapter Pattern)
适配器模式(Adapter Pattern) 推荐一个很全面的博客:https://blog.csdn.net/zxt0601/article/details/52848004 定义:将一个类的接口转 ...
- java设计模式--结构型模式--适配器模式
适配器模式 概述 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适用性 1.你想使用一个已经存在的类,而它的接口不符合你的需 ...
- 结构型模式之Adapter模式
适配器模式把一个类的接口变换成客户端所期待的另一种接口. 在JDK中的体现 把一个接口或类变成另外一种. java.util.Arrays#asList()javax.swing.JTable(Tab ...
- 结构型设计模式——适配器模式(Go)
适配器模式: 适配器模式是用于当别人提供的对象或接口中的方法或者其它属性啥的和我们的重复了,或者看的不顺眼.名字太长了记不住,而将其包装到一个对象中,然后通过你感觉自己舒服的方式或者方法名字去间接的调 ...
- 《精通Python设计模式》学习结构型之适配器模式
大名鼎鼎~~ 在兼容老系统和其它系统外调用时,用得着~ class Synthesizer: def __init__(self, name): self.name = name def __str_ ...
- 【设计模式】结构型01代理模式(Proxy Pattern)
代理模式(Proxy Pattern) 定义:顾名思义,增加中间层,为其他对象提供一种代理以控制对这个对象的访问.核心在于代理二字. 1.和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理 ...
- 怎样让孩子爱上设计模式 —— 7.适配器模式(Adapter Pattern)
怎样让孩子爱上设计模式 -- 7.适配器模式(Adapter Pattern) 标签: 设计模式初涉 概念相关 定义: 适配器模式把一个类的接口变换成client所期待的还有一种接口,从而 使原本因接 ...
- Java 23种设计模式详尽分析与实例解析之二--结构型模式
Java设计模式 结构型模式 适配器模式 模式动机:在软件开发中采用类似于电源适配器的设计和编码技巧被称为适配器模式.通常情况下,客户端可以通过目标类的接口访问它所提供的服务.又是,现有的类可以满足客 ...
- sjms-3 结构型模式
结构型模式 适配器模式 内容:将一个类的接口转换成客户希望的另一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.两种实现方式:类适配器:使用多继承对象适配器:使用组合 角色 ...
随机推荐
- AD19新功能之Gloss Selected(修线)
一.强大的修线功能 鼠标从右下往左上框选线,然后按 tab 键,选中需要修的走线 然后执行 “Route”栏下 “Gloss Selected”命令进行修线: 二.循环至推模式 AD19默认为推挤模式 ...
- 前端知识体系:JavaScript基础-作用域和闭包-this的原理以及几种使用场景
一.问题由来: var obj = { foo: function () { console.log(this.bar) }, bar: 1 }; var foo = obj.foo; var bar ...
- dell 7559 安装Manjaro 18
本来是装黑苹果的,折腾好几天都装好了,是可以正常使用的,可是clover始终有一个问题,每次启动前需要覆盖一遍EFI分区内EFI目录的CLOVER目录内的所有文件,方能引导MAC. 不然就卡Init ...
- 31、[源码]-AOP原理-AnnotationAwareAspectJAutoProxyCreato机
31.[源码]-AOP原理-AnnotationAwareAspectJAutoProxyCreato机
- java.lang.NoClassDefFoundError: org/apache/poi/ss/usermodel/Workbook] with root cause
一.问题描述 使用POI上传excel,本地可正常运行,开发服务器上报错. 二.异常信息如下: 2019-05-05 17:00:22,349 ERROR [http-nio-8080-exec-7] ...
- 003_硬件基础电路_LM2596
以下内容全部从文档中获取有用信息的 链接:https://pan.baidu.com/s/1fEbtY616bJWsuaDOZ0CUjw提取码:1byu 复制这段内容后打开百度网盘手机App,操作更方 ...
- 通过自定义属性获取指定checkbox是否选中
$("input[conferid='"+conferid+"']").is(':checked'); $("input[conferid='1234 ...
- LOJ P10118 打鼹鼠 题解
每日一题 day17 打卡 Analysis 二维树状数组的单点修改和区间查询,和一维的差不多 #include<iostream> #include<cstdio> #inc ...
- 洛谷 UVA10298 Power Strings 题解
Analysis 结论:设字符串长度为n,最长相同前后缀的长度为kmp[i],如n%(n-kmp[n])=0,则答案为n/(n-kmp[n]),否则为1. 如果循环节多于一个,以前n-kmp[n]个为 ...
- linux系列(二十二):tar命令
1.命令格式 tar[必要参数][选择参数][文件] 2.命令功能 用来压缩和解压文件.tar本身不具有压缩功能.他是调用压缩功能实现的 3.命令参数 必要参数: -A 新增压缩文件到已存在的压缩 - ...