1.前言
说起适配器模式最先想到的例子就是110v和220v插头转接器的例子了:
有一天你从香港买来一个iphone8,但是香港的插头要比大陆地区的插头大一些,你回到家之后发现在现有的屋子环境下找不到合适的插口能够插入这个插头。现在有两个办法,一是:更换屋里的所有的或者部分插口能够插下iphone8,但是这个行不通的,家是在大陆,一般电器插口还是国标的,虽然解决了我一时需要使用ip8,但是手机更换这么快很可能我下一次就从大陆地区买ip10了,要是更换屋子的插口,岂不是还要更换回来?。二是:由于iphone8对于我这个屋子来说是临时用品,所以不会改变屋子的现状,而是从香港苹果官网(公司)上买一个港标转国标的适配器,只是在ip8插头上接上这个适配器就可以使用屋子里的插口了,并且这个适配器还有变压的功能。
可以看出适配器的作用就是【接口适配+属性转换】
定义:将一个类(对象)的接口(方法或者属性)转化成另外一个接口以满足用户需求,使类(对象)之间接口的不兼容问题通过适配器得以解决。
换句话说,就是我用我的接口,但是还是用你的服务。
使用场景:
当前系统接口和需求不一致并且重构代价大的时候。
优点
- 允许两个不同的类一起运行
- 灵活性好
- 提高了类的复用
缺点
由于适配器的存在导致实际被使用的类和真正处理需求的类并不是同一个,这对把握系统的结构和减少复杂度是有负面效果的,在重构的难度不大的情况下最好不要使用适配器。
2. 例子
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>适配器</title>
</head>
<body>
</body>
<script>
//中国电源,如果有多个电源请保持接口charging的存在与实现。
class ChineseElectricity
{
//充电
charging(){
return 220;
}
}
//适配器
class AdapterHongkongElectricity{
constructor(electricity) {
this.powerSupply = electricity
}
charging(){
let electricity = this.powerSupply.charging();
if(electricity!=110){
electricity = 110;
}
return electricity;
}
}
class HongkongPhone{
//充电
charging(electricity){
console.log("正在充电:",electricity.charging(),"V");
}
}
let phone = new HongkongPhone();
let elec = new AdapterHongkongElectricity(new ChineseElectricity());
phone.charging(elec);
</script>
</html>
3. 后记
javascript和java不同,没有抽象类和接口,所以接口的抽象需要用文档来规范。所以uml图会比较奇怪,这不是本人的技术问题,orzl。