适配器模式[Adapter]
模式定义:将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能在一起工作的那些类可以一起工作。
eg:用直流电的笔记本电脑接交流电源时需要一个电源适配器,用计算机访问照相机的 SD 内存卡时需要一个读卡器等
适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些
应用场景:1: 当你希望使用某些现有类,但是其接口与你的其他代码不兼容时
2:当你希望重用几个现有的子类,这些子类缺少一些不能添加到超类中的公共功能时。
一:类适配器---使用继承---可以造成接口污染
- 类适配器模式可采用多重继承方式实现,Java 不支持多继承,但可以定义一个适配器类来实现当前系统的业务接口,同时又继承现有组件库中已经存在的组件
1. 模式的结构
适配器模式(Adapter)包含以下主要角色。
- 目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
- 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
- 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。
java代码实现:
public class AdapterTest1 {
public static void main(String[] args) {
ClassAdapter classAdapter = new ClassAdapter();
classAdapter.output5v();
//缺点:接口污染,不符合迪米特原则,这样手机又可以输出5v,又可以输出220v
}
}
//适配者输出220伏的电压
class Adaptee{
public int output220(){
return 220;
}
}
interface Target{
int output5v();
}
class ClassAdapter extends Adaptee implements Target{
@Override
public int output5v() {
int i = output220();
//......
System.out.println(String.format("原始电压:%d V--> 输出电压:%d V",i,5));
return 5;
}
}
二:对象适配器--使用组合
java代码实现:
public class AdapterTest2 {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
Target target = new Adapter(adaptee);
target.output5V();
}
}
//适配者输出220伏的电压
class Adaptee{
public int output220(){
return 220;
}
}
//目标接口--假设是手机电压
interface Target{
int output5V();
}
/**
* 把220伏的电压装换为5V电压
*/
class Adapter implements Target{
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public int output5V() {
int i = adaptee.output220();
//......
System.out.println(String.format("原始电压:%d V--> 输出电压:%d V",i,5));
return 5;
}
}
JDK&Spring源码中的应用
JDK:
java.util.Arrays#asList()
java.util.Collection#list()
spring:
org.springframework.context.event.GenericApplicationListenerAdapter