引子
适配器模式,顾名思义,家用电器中就有很多适配器,比如电源适配器,也就是我们俗称的充电器,USB转接适配器,也就是数据线,连接电脑屏幕的HDMI线也算是适配器。再比如说,你去欧洲旅游,就要买欧标的电源转换头,去美国,就要买美标的电源转换头。可以看出,适配器的功能就是起转换作用。
上面图示,说明了适配器的作用。本来三角肯定是和圆形不可能兼容的,但是有了适配器的存在,不用修改现在的,也不用修改要适配的,就能完成适配功能。
来看官方定义:Adapter Pattren(适配器模式)将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
类图如下:
下面,模拟生活中的场景,平时我们使用的电脑、手机,没电了之后要充电,这时候就用到了电源适配器也就是插头。
目标角色
public interface LaptopPlug {
//电脑开机
void boot();
//玩彩虹六号
void playR6();
//看君克杂质锐雯
void zzRW();
}
public interface IphonePlug {
//聊微信
void weChat();
//刷B站
void bilibili();
}
目标角色实现类
public class Laptop implements LaptopPlug {
@Override
public void boot() {
System.out.println("我需要稳定220v电源,没电开不了机");
}
@Override
public void playR6() {
System.out.println("幻想中:rush b never stop!!!gogogogo!!!");
}
@Override
public void zzRW() {
System.out.println("看不见杂志直播...");
}
}
public class Iphone implements IphonePlug {
@Override
public void weChat() {
System.out.println("呀,手机快没电了!没有转换头!");
}
@Override
public void bilibili() {
System.out.println("还没看完。。。");
}
}
源角色
public class Power {
//电源
public void powerSupply220v() {
System.out.println("提供220v电源,稳定");
}
}
适配器角色
public class Adapter extends Power implements LaptopPlug,IphonePlug {
@Override
public void boot() {
super.powerSupply220v();
}
@Override
public void playR6() {
System.out.println("开干,rush bbbbbb!");
}
@Override
public void zzRW() {
System.out.println("我跳起来打你的那个,杂志,流云行水,谁去帮我把盲僧的桌子掀了!");
}
@Override
public void weChat() {
super.powerSupply220v();
System.out.println("有转换头了,充电充起来!");
}
@Override
public void bilibili() {
System.out.println("b站鬼畜,停不下来!");
}
}
场景类
public class Clinet {
public static void main(String[] args) {
//原有的业务逻辑
LaptopPlug plug = new Laptop();
plug.boot();
plug.playR6();
plug.zzRW();
System.out.println("--------------------------");
//现在增加了适配器角色后的业务逻辑
LaptopPlug plug1 = new Adapter();
plug1.boot();
plug1.playR6();
plug1.zzRW();
System.out.println("--------------------------");
IphonePlug plug2 = new Adapter();
plug2.weChat();
plug2.bilibili();
}
}
运行结果
适配器模式的优点
- 适配器模式可以让两个没有任何关系的类在一起运行,只要适配器这个角色能够搞定他们就行。
- 增加了类的透明性。
- 提高了类的复用度。
- 灵活性非常好。
适配器的使用场景
你有动机修改一个已经投产中的接口时,适配器模式可能是最好的选择。比如系统扩展,需要使用一个已有或新建立的类,但这个类又不符合系统的接口。
适配器模式的注意事项
适配器模式最好再详细设计阶段不要考虑它,它不是为了解决还处在开发阶段的问题,而是解决正在服役的项目问题,没有一个系统分析师会在做详细设计的时候考虑使用适配器模式,这个模式使用的主要场景是扩展应用中。再有就是,项目一定要遵守依赖倒置原则和里氏替换原则,否则即使在适合使用适配器的场景下,也会带来非常大的改造。