《设计模式》设计模式的基本原则
《设计模式》单例模式
《设计模式》工厂模式
《设计模式》原型模式
《设计模式》建造者模式
《设计模式》适配器模式
《设计模式》桥接模式
《设计模式》装饰者模式
《设计模式》组合模式
《设计模式》外观模式
《设计模式》享元模式
《设计模式》代理模式
《设计模式》模板方法模式
《设计模式》命令模式

《设计模式》适配器模式

  • 1. 类适配器模式
  • 2. 对象适配器模式
  • 3. 接口适配器模式
  • 4. 适配器模式在 SpringMVC 中的应用
  • 5. 小结

定义

  • 适配器模式属于结构型模式,又称包装器模式。它可以将某个类的接口转换成客户端期望的另一个接口表示,使得原本因接口不匹配不能一起工作的两个类可以协同工作,保证了兼容性。

工作原理:用户调用适配器转化出来的目标接口方法,适配器再调用被适配者的相关接口方法,用户收到反馈结果,感觉只是和目标接口交互。

适配器的实现方式有三类:类适配器模式、对象适配器模式和接口适配器模式

1. 类适配器模式

基本介绍Adapter 类通过继承 src 类并实现 dst 类接口,从而完成 src->dst 的适配。

以生活中充电器的例子来讲解适配器,充电器本身相当于 Adapter,220V 交流电相当于 src,5V 直流电相当于 dst.

分析的 UML 类图如下所示:

Voltage5V

public interface Voltage5V {int output5V();
}

Voltage220V

public class Voltage220V {public int output220V() {int src = 220;System.out.println("电压"+src+"伏");return src;}
}

VoltageAdapter

public class VoltageAdapter extends Voltage220V implements Voltage5V {@Overridepublic int output5V() {int src = output220V();int dst = src / 44;  //转换成5Vreturn dst;}
}

Phone

public class Phone {public void charging(Voltage5V voltage5V) {if (voltage5V.output5V() == 5) {System.out.println("电压为5V,可以充电");} else if (voltage5V.output5V() > 5) {System.out.println("电压大于5V,不能充电");}}
}

Client

public class Client {public static void main(String[] args) {System.out.println("类适配器模式");Phone phone = new Phone();phone.charging(new VoltageAdapter());}
}

类适配器的注意事项

  • 由于 Java 是单继承机制,因此当适配器需要继承 src 类时,这就要求 dst 必须是接口,有一定的局限性。
  • src 类的方法在 Adapter 中都会暴露出来,增加了使用成本。
  • 由于其继承了 src 类,因此可以根据需求重写 src 类的方法,使得 Adapter 的灵活性增强了。

2. 对象适配器模式

基本介绍:其基本思路与类适配器模式相同,只是将 Adapter 类作修改,不是继承 src 类而是持有 src 类的实例以解决兼容性的问题,即:持有 src 类实现 dst 类接口完成 src->dst 的适配。

分析充电器适配的例子,其 UML 类图如下:

VoltageAdapter

public class VoltageAdapter implements Voltage5V{private Voltage220V voltage220V;  //关联关系-聚合public VoltageAdapter(Voltage220V voltage220V) {this.voltage220V = voltage220V;}@Overridepublic int output5V() {int dst = 0;if (voltage220V != null) {int src = voltage220V.output220V();System.out.println("使用对象适配器,进行适配");dst = src / 44;System.out.println("适配完成,输出的电压为"+dst);}return dst;}
}

Client

public class Client {public static void main(String[] args) {System.out.println("对象适配器模式");Phone phone = new Phone();phone.charging(new VoltageAdapter(new Voltage220V()));}
}

对象适配器的优点

  • 使用组合替代继承,克服了类适配器必须继承 src 的局限性,也不要求 dst 必须是接口。

3. 接口适配器模式

基本介绍

  • 不需要实现接口的全部方法时,可以先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可以选择覆盖父类的某些方法来实现需求。
  • 适用于一个接口不想使用其所有的方法的情况

4. 适配器模式在 SpringMVC 中的应用

SpringMVC 中的处理器适配器 HandlerAdapter 就使用了适配器模式:

  • HandlerAdpater 作为一个适配器接口,它的实现子类使得每一种 Controller 有对应的适配器实现类
  • 适配器代替 Controller 执行相应的方法
  • 扩展 Controller 时,只需要增加一个适配器类就完成了 SpringMVC 的扩展了

5. 小结

三种命名方式是根据 src 以怎样的形式给到 Adapter 来命名:

  • 类适配器:以类给到,在 Adapter 类里,将 src 当作类继承
  • 对象适配器:以对象给到,在 Adapter 类里,将 src 作为一个对象持有
  • 接口适配器:以接口给到,在 Adapter 类里,将 src 作为一个对象实现

适配器模式就是将原本不兼容的接口融合到一起工作

《设计模式》适配器模式相关推荐

  1. Python设计模式-适配器模式

    Python设计模式-适配器模式 基于Python3.5.2,代码如下 #coding:utf-8class ACpnStaff:name = ""id = "" ...

  2. Java | 设计模式-适配器模式

    继代理模式后又来到适配器模式啦,想看之前的也有哦.持续更新中哦.让我们一起加油吧兄弟们,干他. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 你好,如果喜欢,请一起坚持!! ...

  3. java设计模式适配器模式_Java中的适配器设计模式

    java设计模式适配器模式 适配器设计模式是一种结构设计模式 ,可以帮助我们连接到通过不同接口公开相似功能的旧版或第三方代码. 适配器的现实世界是我们用来将USB电缆连接到以太网端口的类比. 在设计一 ...

  4. 设计模式适配器模式_适配器设计模式示例

    设计模式适配器模式 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要 ...

  5. 设计模式适配器模式_21世纪的设计模式:适配器模式

    设计模式适配器模式 这是我的演讲的第三部分," 21世纪的设计模式" . 适配器模式桥接世界. 在一个世界中,我们有一个概念的界面. 在另一个世界,我们有不同的界面. 这两个接口有 ...

  6. java设计模式适配器模式_Java解释器设计模式

    java设计模式适配器模式 Interpreter design pattern is one of the behavioral design pattern. Interpreter patter ...

  7. Java代码审计-设计模式-适配器模式

    Java设计模式-适配器模式(Adapter Pattern) 目录 什么是适配器模式 适配器模式的3种类型 JavaSE适配器模式的应用 Struts2适配器模式的应用 适配器模式是一种" ...

  8. 【设计模式】Java设计模式 - 适配器模式

    [设计模式]Java设计模式 - 适配器模式

  9. C++设计模式——适配器模式(adapter pattern)

    一.原理讲解 适配器模式别名为包装器(wrapper),分为类适配器(通过多继承实现).对象适配器(组合方式实现),由于类适配器比较少用,本文主要讲解用的比较多的对象适配器. 1.1意图 将一个类的接 ...

  10. [Head First设计模式]身边的设计模式——适配器模式

    系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式- ...

最新文章

  1. iOS 模仿支付宝支付到账推送,播报钱数
  2. SVN积极拒绝解决办法
  3. html固定dl高度_HTML入门笔记1
  4. Laravel5.2目录结构及composer.json文件解析
  5. Net基础篇_学习笔记_第十二天_面向对象继承(字符串_字符串的不可变性)
  6. 如何保护.net中的dll文件(防破解、反编译)
  7. Linux平台音频测试程序
  8. layer右下脚弹窗
  9. 如何获取Oracle存储过程中的参数名称、类型?
  10. Android 5.0新控件——TextInputLayout
  11. 准备上线,切换到master分支,报错
  12. 红包雨架构设计---1、技术架构
  13. arcgis runtime for android 100.13.0 入门系列,三、加载shp,kml,tpk文件,图层定位,toolkit工具
  14. Poison Frogs! Targeted Clean-Label Poisoning Attacks on Neural Networks 论文阅读、复现及思考
  15. marshmallow——快速入门
  16. 今天2006的第一天,灰蒙蒙的元旦节!
  17. 制作自己的字体图标库
  18. 如何检测电脑系统是否为正版系统
  19. STM32CubeIDE:ld.exe: xxx.elf section `.rodata‘ will not fit in region `FLASH‘;`FLASH‘ overflowed
  20. python之json扩展

热门文章

  1. UE4小知识点总结合集【一】
  2. 如何理解低功耗智能通信产品资产监测设备中的天线效率?
  3. WebService教程实例
  4. Python练习笔记 - - 彩色宝石项链
  5. CRC算法 个人学习笔记 直接法、查表法注意点
  6. 详解pdfFactory转换PDF文档的预览窗口视图
  7. yield和return的区别-- 超详细
  8. php拍照,php视频拍照上传头像功能实现代码分享
  9. 徐荣谦《养好脾和肺 宝宝不积食不咳嗽长大个》【04】穴位健脾
  10. css旋转不围绕圆心,无法围绕中心css旋转图像