图解设计模式 - Adapter 模式
读书笔记 仅供参考
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 模式相关推荐
- 设计模式-Adapter模式
目录 相关概念 对象适配器 类适配器 一个例子 总结 适配器模式(Adapter Pattern)是结构型模式.主要用来解决接口不兼容的问题,将一个类的接口变换成客户端所期待的另一种接口,从而使原本因 ...
- 设计模式Adapter模式的五分钟
五分钟一个设计模式.来形容叙述的设计模式的最简单方法.看到许多其他设计模式,请点击五分钟一个设计模式系列 http://blog.csdn.net/daguanjia11/article/catego ...
- 图解设计模式- Mediator 模式
读书笔记 仅供参考 简述 Mediator 就是 仲裁者(中介者)模式.如果将程序看作许多类作为一个团队进行工作,那么团队的交流过程就是组员向仲裁者报告,仲裁者向组员下达指标,组员之间不再相互询问. ...
- 图解设计模式-Bridge模式
Bridge桥连接模式的作用是将两样东西链接起来,它们分别是类的功能层次结构和类的实现层次结构. 类的功能层次结构 当有一个Something类,要增加它的功能时,可以创建SomethingGood类 ...
- 【笔记整理】图解设计模式 | 第12章 Decorator模式(装饰边框与被装饰物的一致性)
[笔记整理]图解设计模式 | 导航 定义 不断地为对象添加装饰的设计模式被称为Decorator模式,其中Decorator指的是"装饰物". Decorator模式中的登场角色 ...
- 结城浩的《图解设计模式》设计模式之Adapter模式的理解
书中举的电源适配器的例子,还有网上各种同类的例子,无法说服我. Banner类的两个方法,代表输出交流100伏,虽然外部调用的是Print接口的要输出12伏特的方法,但是实际还是调用PrintBann ...
- 设计模式学习笔记——适配器(Adapter)模式
设计模式学习笔记--适配器(Adapter)模式 @(设计模式)[设计模式, 适配器模式, adapter, 适配器] 设计模式学习笔记适配器Adapter模式 基本介绍 适配器案例 类适配器模式 类 ...
- 【笔记整理】图解设计模式 | 第16章 Mediator模式(只有一个仲裁者)
[笔记整理]图解设计模式 | 导航 定义 组员向仲裁者报告,仲裁者向组员下达指示. 当发生麻烦事情的时候,通知仲裁者:当发生涉及全体组员的事情时,也通知仲裁者. 当仲裁者下达指示时,组员会立即执行.团 ...
- Java 设计模式 Adapter 对象适配器 模式
Java 设计模式 Adapter 对象适配器 模式 Adapter模式用于现有的程序无法直接使用,需要做适当的变换之后才能使用的情况. 涉及到的角色 Target对象:定义所需的方法. Client ...
- 设计模式【7】——适配器模式(Adapter 模式)
文章目录 前言 一.适配器模式(Adapter 模式) 二.具体源码 1.Adapter.h 2.Adapter.cpp 3.main.cpp 三.运行结果 总结 前言 实际上在软件系统设计和开发中, ...
最新文章
- 树形dp ---- gym101655 D - Delta Quadrant 树上连通块思维换根 + 树形dp
- Vue 踩坑日志 - 有关路由传参的坑
- python通过ip池爬_Python爬虫 | IP池的使用
- scikit-learn学习笔记(五)Logistic regression(逻辑回归)
- 2018-2019-1 20189218《Linux内核原理与分析》第九周作业
- STM32工作笔记0044---什么是二极管什么是三极管
- mysql把字段名批量改为大写_MySQL批量将表名或者列名大小写转换
- pip和pip3 换源
- 单片机控制IIC协议EEPROM芯片24C512之模块化编程(持续更新中)
- 摸索Detours 3:使用Detours 采用dll 方式进行Hook
- 神器:PDF批量替换文字
- Element UI-动态合并表格行
- C语言打印图形小妙招
- 【3】现代计算机图形学(正交投影,透视投影,MVP变换)
- 基于php的微信公众平台开发入门实例
- 网格环境配置(三):安装SGE
- Leetcode-数据结构-53.最大子数组和
- 【无标题】ChatGPT的官网是多少,在国内能使用吗
- Gerrit提交代码相关命令
- 基于springboot_+java古诗词分享数字化平台