读书笔记 仅供参考

Adapter 模式

Adapter 即为是适配器,用来填补两者之间的差异。就想充电器的装换器,要把 220v 的电压转换为低电压才能对手机或电脑充电。
Adapter 模式也称为 Wrapper(包装器)模式。
两种 Adapter 模式:

  • 类适配器模式(使用继承的适配器)
  • 对象适配器模式(使用委托的适配器)

角色

Client 类是客户端,调用适配器。
Adaptee 是需要包装的类,等于是 220V 电压的接头。
Target 接口是供客户端调用的接口,它定义了适配器需要实现的方法,等于是手机充电转化器的 USB 插口。
Adapter 类是适配器类,它继承了 Adaptee 类和实现类 Target 接口,等于转换器的内部构造,清楚如何将电压从 220V 转为 5V。

代码

https://github.com/wujunyucg/DesignPattern/tree/master/src/chapter01/adapter

类适配模式

UML

例子

Banner 类,作为 Adaptee,实现了最初的方法。

public class Banner {private String string;public Banner(String string) {this.string = string;}public void showWithPattern() {System.out.println("(" + string + ")");}public void showWithStar() {System.out.println("*" + string + "*");}
}

Print 接口,定义了客户端调用的方法,作为 Target

public interface Print {void printWeek();void printStrong();
}

PrintBanner 类,继承了 Banner 和实现了 Target,作为 Adpter

public class PrintBanner extends Banner implements Print{public PrintBanner(String string) {super(string);}@Overridepublic void printWeek() {showWithPattern();}@Overridepublic void printStrong() {showWithStar();}
}

Main 类,测试效果

public class Main {public static void main(String[] args) {Print print = new PrintBanner("Hello");print.printWeek();print.printStrong();}
}

在这个例子中,Main 调用 PrintBanner 的方法,实际上起作用的是 Banner 类中的方法,Main 并不知道其中的实现是怎样的。

例子 UML

对象适配器模式

对象适配器模式即是使用委托的模式,使用组合来替代继承。

UML


这张图和上面一张图的区别是 Adapter 并不是继承 Adaptee 和 实现 Target 了。
Adaptee 的实例作为 Adapter 的一个属性。Target 并不是一个接口,而是一个抽象类,同样定义了供 Client 调用的方法,Adapter 继承了 Target 类。

程序例子

Main 和 Banner 的程序和上面一样。

Print 类,为抽象类。

public abstract class Print {public abstract void printWeek();public abstract void printStrong();
}

PrintBanner 类,拥有一个 Banner 实例,继承了 Print 类。在实现哦方法中调用了 Banner 的方法。

public class PrintBanner extends Print{private Banner banner;public PrintBanner(String string) {this.banner = new Banner(string);}@Overridepublic void printWeek() {banner.showWithPattern();}@Overridepublic void printStrong() {banner.showWithStar();}
}

例子 UML

何时使用 Adapter 模式

复用已有组件

我们更倾向于不修改已有程序的代码,并且能够更多的复用已存在的“组件”。Adapter 模式会对现有类进行适配,生成新的类,当出现 BUG 时,我们也能确定出现问题的是 Adapter 类,而不是 Adaptee 类。

没有现成的代码

有时候我们会想到把现有程序改一改就可以成功运行了,但有时候我们只能使用一些特定的接口,无法知道源代码,这样 Adapter 模式就可以发挥作用了。

版本升级与兼容性

使用 Adapter 模式可以很好地解决软件版本升级后出现的兼容性问题。

相关设计模式

Bridge 模式

Adapter 模式用于连接接口不同的类,Bridge 模式用于连接类的功能层次结构和实现层次结构

Decorator 模式

Decorator 模式是在不改变接口的前提下添加功能。

图解设计模式 - Adapter 模式相关推荐

  1. 设计模式-Adapter模式

    目录 相关概念 对象适配器 类适配器 一个例子 总结 适配器模式(Adapter Pattern)是结构型模式.主要用来解决接口不兼容的问题,将一个类的接口变换成客户端所期待的另一种接口,从而使原本因 ...

  2. 设计模式Adapter模式的五分钟

    五分钟一个设计模式.来形容叙述的设计模式的最简单方法.看到许多其他设计模式,请点击五分钟一个设计模式系列 http://blog.csdn.net/daguanjia11/article/catego ...

  3. 图解设计模式- Mediator 模式

    读书笔记 仅供参考 简述 Mediator 就是 仲裁者(中介者)模式.如果将程序看作许多类作为一个团队进行工作,那么团队的交流过程就是组员向仲裁者报告,仲裁者向组员下达指标,组员之间不再相互询问. ...

  4. 图解设计模式-Bridge模式

    Bridge桥连接模式的作用是将两样东西链接起来,它们分别是类的功能层次结构和类的实现层次结构. 类的功能层次结构 当有一个Something类,要增加它的功能时,可以创建SomethingGood类 ...

  5. 【笔记整理】图解设计模式 | 第12章 Decorator模式(装饰边框与被装饰物的一致性)

    [笔记整理]图解设计模式 | 导航 定义 不断地为对象添加装饰的设计模式被称为Decorator模式,其中Decorator指的是"装饰物". Decorator模式中的登场角色 ...

  6. 结城浩的《图解设计模式》设计模式之Adapter模式的理解

    书中举的电源适配器的例子,还有网上各种同类的例子,无法说服我. Banner类的两个方法,代表输出交流100伏,虽然外部调用的是Print接口的要输出12伏特的方法,但是实际还是调用PrintBann ...

  7. 设计模式学习笔记——适配器(Adapter)模式

    设计模式学习笔记--适配器(Adapter)模式 @(设计模式)[设计模式, 适配器模式, adapter, 适配器] 设计模式学习笔记适配器Adapter模式 基本介绍 适配器案例 类适配器模式 类 ...

  8. 【笔记整理】图解设计模式 | 第16章 Mediator模式(只有一个仲裁者)

    [笔记整理]图解设计模式 | 导航 定义 组员向仲裁者报告,仲裁者向组员下达指示. 当发生麻烦事情的时候,通知仲裁者:当发生涉及全体组员的事情时,也通知仲裁者. 当仲裁者下达指示时,组员会立即执行.团 ...

  9. Java 设计模式 Adapter 对象适配器 模式

    Java 设计模式 Adapter 对象适配器 模式 Adapter模式用于现有的程序无法直接使用,需要做适当的变换之后才能使用的情况. 涉及到的角色 Target对象:定义所需的方法. Client ...

  10. 设计模式【7】——适配器模式(Adapter 模式)

    文章目录 前言 一.适配器模式(Adapter 模式) 二.具体源码 1.Adapter.h 2.Adapter.cpp 3.main.cpp 三.运行结果 总结 前言 实际上在软件系统设计和开发中, ...

最新文章

  1. 树形dp ---- gym101655 D - Delta Quadrant 树上连通块思维换根 + 树形dp
  2. Vue 踩坑日志 - 有关路由传参的坑
  3. python通过ip池爬_Python爬虫 | IP池的使用
  4. scikit-learn学习笔记(五)Logistic regression(逻辑回归)
  5. 2018-2019-1 20189218《Linux内核原理与分析》第九周作业
  6. STM32工作笔记0044---什么是二极管什么是三极管
  7. mysql把字段名批量改为大写_MySQL批量将表名或者列名大小写转换
  8. pip和pip3 换源
  9. 单片机控制IIC协议EEPROM芯片24C512之模块化编程(持续更新中)
  10. 摸索Detours 3:使用Detours 采用dll 方式进行Hook
  11. 神器:PDF批量替换文字
  12. Element UI-动态合并表格行
  13. C语言打印图形小妙招
  14. 【3】现代计算机图形学(正交投影,透视投影,MVP变换)
  15. 基于php的微信公众平台开发入门实例
  16. 网格环境配置(三):安装SGE
  17. Leetcode-数据结构-53.最大子数组和
  18. 【无标题】ChatGPT的官网是多少,在国内能使用吗
  19. Gerrit提交代码相关命令
  20. 基于springboot_+java古诗词分享数字化平台

热门文章

  1. 《游戏脚本高级编程》
  2. python探究小市值因子的有效性
  3. scipy安装_4. Python--Scipy库(下/13-17)
  4. VC定时器SetTimer函数
  5. linux 内核专题— drv术语
  6. 2021 软考 软件设计师考试教程(详细版)
  7. linux下编译jrtplib和jthread,Linux下编译jrtplib和jthread(转)
  8. 计算机单片机毕设答辩问题,单片机毕业论文答辩常见问题.docx
  9. 音视频处理入门基础知识
  10. 【中国传媒大学】史上最全的《电视原理》笔记