适配器模式
时间:2022-04-26
本文章向大家介绍适配器模式,主要内容包括优势、缺点、适配器 装饰者 外观模式的不同:、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适用场景:
1、已经存在的类的接口不符合我们的需求;
2、创建一个可以复用的类,使得该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作;
3、在不对每一个都进行子类化以匹配它们的接口的情况下,使用一些已经存在的子类。
UML图:
适配器的意义在于,就是为了将已存在的东西(接口)转换成适合我们的需要、能被我们所利用。非常形象的比喻:就像生活中的手机充电器,电脑的电源适配器一样。适配器就行Client和Target的中间件。
代码实现:
普通接口
<span style="font-size:12px;">public class ConcreteTarget implements Target{
@Override
public void request() {
System.out.println("普通类 ...");
}
}
//目标接口
interface Target {
public void request();
}</span><span style="font-size: 14px;">
</span>
特殊接口:
<span style="font-size:12px;">public class Adapter {
public void specificAdapter() {
System.out.println("适配器模式特殊接口...");
}
}</span>
所以我们要实现普通和特殊的功能,
class Adapter extends Adaptee implements Target{
public void request() {
super.specificRequest();
}
}
测试
public class Client {
public static void main(String[] args) {
// 使用普通功能类
Target concreteTarget = new ConcreteTarget();
concreteTarget.request();
// 使用特殊功能类,即适配类
Target adapter = new Adapter();
adapter.request();
}
}
小结
优势
- 使用对象组合的方式,用修改的接口来包装适配者
- 被适配者的任何子类也可以搭配适配器使用
- 个人觉得使用适配器最大的好处是 不需要修改客户端以及被适配者的代码。
缺点
- 需要实现所有的方法去完成适配,如果目标非常大,那么工作量也比较大。
NOTE:之前提到的都是 对象适配器,另外还有一种叫做 类适配器,不过类适配器需要多重继承去实现(Adapter需要继承Target和Adaptee),而不是组合的方式去实现。
适配器 装饰者 外观模式的不同:
适配器是:将一个接口转成另一个接口 装饰者是:不改变接口,但加入新的责任 外观模式是:让接口更简单
- [Go语言]从Docker源码学习Go——指针和Structs - lemon_bar
- Git 项目推荐 | Go 语言读写 INI 文件工具包
- 初识Python (r10笔记第52天)
- 挑战数据结构与算法面试题——统计上排数在下排出现的次数
- Go语言的 10 个实用技术--转
- MySQL反连接的优化总结(r10笔记第51天)
- python基础知识——内置数据结构(列表)
- 【Go 语言社区】Go语言Slice去重
- 【Go 语言社区】Golang 语言再谈接口
- 【Go 语言社区】Golang 语言再谈常量
- 【Go 语言社区】HTML5 Canvas+JS控制电脑或手机上的摄像头实例
- MySQL Profile在5.7的简单测试(r10笔记第50天)
- 【Go 语言社区】Golang中interface判断nil问题
- 有趣的rownum测试(r10笔记第49天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android调用系统自带浏览器打开网页的实现方法
- Linux之删除带有空格的文件(不是目录)
- Android自定义AvatarImageView实现头像显示效果
- 如何使用win10内置的linux系统启动spring-boot项目
- Android 实现单线程轮循机制批量下载图片
- Android开发之项目模块化实践教程
- Linux centos7 下安装 phpMyAdmin的教程
- 简单学习Android TextView
- Android 滑动返回Activity的实现代码
- centos7搭建hadoop2.10高可用(HA)
- 在 React 中实现 keep alive(可参与文末讨论哦)
- Android仿淘宝切换商品列表布局效果的示例代码
- android 右滑返回的示例代码
- 关于linux服务器hosts文件配置详解
- android中Glide实现加载图片保存至本地并加载回调监听