这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战
设计模式手册之适配器模式
适配器模式:为多个不兼容接口之间提供“转化器”。
什么是适配器模式?
适配器模式:为多个不兼容接口之间提供“转化器”。
它的实现非常简单,检查接口的数据,进行过滤、重组等操作,使另一接口可以使用数据即可。
应用场景
当数据不符合使用规则,就可以借助此种模式进行格式转化。
多语言实现
假设编写了不同平台的音乐爬虫,破解音乐数据。而对外向用户暴露的数据应该是具有一致性。
下面,adapter
函数的作用就是转化数据格式。
JAVA实现
package com.jstao.adapter;
/**
* 定义一个显示屏
* 与适配器对接
* @author jstao
*
*/
public class Screen {
public static void main(String[] args) {
//第一种适配器用法
System.out.println("-------------第一种适配器------------");
Vga vga = new Typec2Vga1();
vga.vgaInterface();//适配器将typec转换成vga
System.out.println("显示屏对接适配器,手机成功投影到显示屏!");
//第二种适配器用法
System.out.println("-------------第二种适配器------------");
Typec2Vga2 typec2Vga1 = new Typec2Vga2(new Phone());
typec2Vga1.vgaInterface();//适配器将typec转换成vga
System.out.println("显示屏对接适配器,手机成功投影到显示屏!");
//第三种适配器用法
System.out.println("-------------第三种适配器------------");
VgaAdapter vgaAdapter = new VgaAdapter();
vgaAdapter.typec();
vgaAdapter.typec2vga();//适配器将typec转换成vga
System.out.println("显示屏对接适配器,手机成功投影到显示屏!");
}
}
复制代码
ES6 实现
const API = {
qq: () => ({
n: "菊花台",
a: "周杰伦",
f: 1
}),
netease: () => ({
name: "菊花台",
author: "周杰伦",
f: false
})
};
const adapter = (info = {}) => ({
name: info.name || info.n,
author: info.author || info.a,
free: !!info.f
});
/*************测试函数***************/
console.log(adapter(API.qq()));
console.log(adapter(API.netease()));
复制代码
分析
优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。
缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。 2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
使用场景: 有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。
注意事项: 适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END