适配器模式
1、什么是适配器模式?
- 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。
- 这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
- 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。
主要解决:
主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。
2、适配器有什么用?
- 将一个类的接口转换成客户希望的另外一个接口。
- 适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
比如:
- 读卡器是作为内存卡和笔记本之间的适配器。
- 将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。
3、优缺点
- 可以让任何两个没有关联的类一起运行。
- 提高了类的复用。
- 增加了类的透明度。
- 灵活性好。
- 解耦合。
- 更好的扩展性
缺点
- 过多地使用适配器,会让系统非常零乱,不易整体进行把握。
- 比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。
- 由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。
示例:
- 背景:小明买了一个空调
- 冲突:空调要求电压(110V)与国内插头标准输出电压(220V)不兼容
- 解决方案:设置一个适配器将插头输出的220V转变成110V
1、类的适配器模式(了解)
优点
- 使用方便,代码简化
仅仅引入一个对象,并不需要额外的字段来引用Adaptee实例
缺点
- 高耦合,灵活性低
使用对象继承的方式,是静态的定义方式
创建插头接口
//插头
public interface Plug {
//需要的电压 220V
void voltage_220();
}
空调
//空调
public class AirConditioner {
public void voltage_110(){
System.out.println("110V 电压");
}
}
适配器
//适配器
public class Adapter extends AirConditioner implements Plug{
@Override
public void voltage_220() {
//调用 AirConditioner 的方法
super.voltage_110();
}
}
Demo 测试
public class Demo {
public static void main(String[] args) {
Plug plug = new Adapter();
plug.voltage_220();
}
}
//测试结果
110V 电压
2、对象的适配器模式
优点
- 灵活性高、低耦合
采用 “对象组合”的方式,是动态组合方式
缺点
- 使用复杂
需要引入对象实例
插头
//插头
public interface Plug {
//需要的电压 220V
void voltage_220();
}
空调
//空调
public class AirConditioner {
public void voltage_110(){
System.out.println("110V 电压");
}
}
适配器
//适配器
public class Adapter implements Plug{
//把需要转换的 当作属性 放在适配器类中
private AirConditioner airConditioner ;
//在创建类的时候就把对象给加载进来
//当然在实际开发中是不会这么干的,在这里举例就这样写了
public Adapter(AirConditioner airConditioner) {
this.airConditioner = airConditioner;
}
@Override
public void voltage_220() {
//调用 AirConditioner 的方法
airConditioner.voltage_110();
}
}
Demo测试
public class Demo {
public static void main(String[] args) {
Plug plug = new Adapter(new AirConditioner());
plug.voltage_220();
}
}
//测试
110V 电压