适配器模式
将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作
分类: 类适配器、对象适配器
优点:
- 可以让任何两个没有关联的类一起运行
- 提高了类的复用
- 增加了类的透明度
- 灵活性好
缺点:
- 过多地使用适配器,会让系统非常零乱,不易整体进行把握。(例如我调用的命名是A接口,其内部却被适配成了B接口的实现)
使用场景:
- 系统需要使用现有的类,而此类的接口不符合系统的需要
- 通过接口转换,将一个类插入另一个类系中
- 有动机地修改一个正常运行的系统的接口
- 使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能
使用实例:
FutureTask 实现了 Runnable 接口,组合了 Callable,可以使 Callable 与 Thread 组合使用
类适配器
假设我们原手机充电孔是 Type-B 充电孔,但现在没有只有一个 Type-C 的充电线,因此,需要将其进行适配
原有接口
/**
* 充电孔接口
*/
public interface ChargeHole {
void setType();
}
原有接口实现
public class TypeB implements ChargeHole{
@Override
public void setType() {
System.out.println("Type-B 充电插孔");
}
}
新增功能类
public class TypeC {
public void setTypeC() {
System.out.println("Type-C 充电插孔");
}
}
创建适配器
public class Adapter extends TypeC implements ChargeHole{
@Override
public void setType() {
setTypeC();
}
}
测试类及运行结果
public class Test {
public static void main(String[] args) {
// 原来的
TypeB typeB = new TypeB();
typeB.setType();
// 适配后
Adapter adapter = new Adapter();
adapter.setType();
}
}
-------------运行结果-----------------
Type-B 充电插孔
Type-C 充电插孔
对象适配器
还是原来的例子,这里只需要将适配器改为适配对象,并在测试端将对象传入即可
适配器类
public class Adapter implements ChargeHole {
private TypeC typeC;
public Adapter(TypeC typeC){
this.typeC = typeC;
}
@Override
public void setType() {
this.typeC.setTypeC();
}
}
测试类
public class Test {
public static void main(String[] args) {
// 原来的
TypeB typeB = new TypeB();
typeB.setType();
// 适配后
Adapter adapter = new Adapter(new TypeC());
adapter.setType();
}
}