定义
Convert the interface of a class into another interface clients expect.Adapter lets classes work together that couldn’t otherwise because of incompatible interfaces.(将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。)
适配器模式又称变压器模式,也叫做包装模式(Wrapper)。
适配器的角色:
- Target目标角色:该角色定义把其他类转换成何种接口,也就是我们的期望接口。
- Adaptee源角色:需要转换成目标角色的就是源角色,它是已经存在的、运行良好的类或对象,经过适配器角色的包装,它会成为一个全新的角色。
- Adapter适配器角色:适配器模式的核心角色,其他两个角色都是已经存在的角色,而适配器角色是需要新建立的,它的职责就是把源角色转换为目标角色。通过继承或是关联的方式。
/**
* 目标角色
*/
public interface Target {
// 目标角色自己的方法
void request();
}
/**
* 源角色
*/
public class Adaptee {
public void doSomething(){
System.out.println("源角色原来的逻辑");
}
}
/**
* 适配器角色
*/
public class Adapter extends Adaptee implements Target {
@Override
public void request() {
super.doSomething();
}
}
适配器模式的应用
适配器模式的优点
- 适配器模式可以让两个没有任何关系的类在一起运行:只要适配器这个角色能够搞定这两个类就行。
- 增加了类的透明度:我们访问的Target角色,但是具体实现都委托给了源角色,这些对高层模块是透明的,也是它们不需要关心的。
- 提高了类的复用度:源角色在原有系统中还是可以正常使用,而在目标角色中也可以充当新的演员。
- 灵活性非常好:如果不想用适配器,直接删除就行了。
适配器模式的使用场景
需要修改一个已经在投产中的接口时,就可以考虑适配器模式。比如系统扩展了,需要使用一个已有或新建立的类,但这个类又不符合系统的接口,就可以使用适配器模式。
适配器模式的注意事项
适配器模式最好在详细设计阶段不要考虑他,他不是为了解决还处在开发阶段的问题,而是解决正在服役的项目问题,主要场景是在扩展应用中。
项目一定要遵守依赖倒置原则和里氏替换原则,否在即使在适合使用适配器的场合下,也会带来非常大的改造。
适配器模式的扩展
需要将多个源角色对应到一个目标角色上,应为不能继承源角色,所以将多个源角色对象关联到适配器角色中。
/**
* 适配器角色
*/
public class Adapter implements Target {
private Adaptee1 a1;
private Adaptee2 a2;
@Override
public void request1() {
a1.doSomething1();
}
@Override
public void request2() {
a2.doSomething2();
}
}