适配器模式
一、定义
在不修改原来代码的情况下,适配器模式使接口不兼容的那些类可以一起工作。
二、适配器结构
1、Target(目标抽象类):目标抽象类定义客户所需的接口,可以是一个抽象类或者接口,也可以是具体类。在类适配器中,由于Java语言不支持多重继承,它只能是接口。
2、Adapter(适配器类):它可以调用另一个接口 ,作为一个转换器,对Adaptee和Target进行适配。适配器Adapter是适配器模式的核心,在类适配器中,它通过实现Target接口并继承Adaptee类来使二者产生联系,在对象适配器中,它通过继承Target并关联一个Adaptee对象来使二者产生联系。
3、Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体的类,包含了客户希望使用的业务方法,在某些情况下甚至没有适配者类的代码。
三、实现
mac电脑多屏显示需要外接显示屏,此时就需要一个转接头。
1、类适配器
// 定义一个屏幕显示画面
public class Screen {
public void show(){
System.out.println("屏幕显示画面");
}
}
//定义一个显示器适配器(转接头)
public interface ScreenAdapter {
void adaption();
}
//将显示器接到mac上,完成多屏显示
public class ToMacAdapter extends Screen implements ScreenAdapter{
@Override
public void adaption() {
System.out.println("接入转换器");
super.show();
}
}
2、对象适配器
但是我又想接多屏显示,又想听音乐的话,类适配器就不能支持了。这时我们可以用对象适配器。
//听音乐
public class Music {
public void listen(){
System.out.println("listen music");
}
}
public interface MixAdapter {
//听音乐
void listenMusic();
//联网
void screen();
}
public class USBCAdapter implements MixAdapter{
private Screen screen;
private Music music;
@Override
public void listenMusic() {
music.listen();
}
@Override
public void screen() {
screen.show();
}
}
四、适配器模式的优缺点
优点:
1、能提高类的透明性和复用,现有的类复用但不需要改变。
2、目标类和适配器类解耦,提高程序的扩展性。
3、在很多业务场景中符合开闭原则。
缺点:
1、适配器编写过程需要全面考虑,可能会谧加系统的复杂性。
2、增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。