定义
将一个接口(或者是类)转换成客户希望的接口(或者是类),使得原本因接口不匹配的两个类能够一起工作。比如我们日常生活中和电脑搭配使用的转接线。该模式又分为类适配器模式和对象适配器模式。
角色组成
目标角色(Target):客户希望的接口
源角色(Adaptee):存在于系统中,内容满足客户需求,但类型不是客户希望的
适配器角色(Adapter):将源角色转化为目标角色的类
类适配器模式
该模式下,适配器通过实现目标角色对应的接口,继承源角色对应的类来完成转化。
/**
* 目标角色
*/
public interface Target {
void ope1();
void ope2();
}
/**
* 源角色
*/
public class Adaptee {
public void call() {
System.out.println("源角色-已有的方法");
}
}
/**
* 适配器角色
*/
public class Adapter extends Adaptee implements Target {
@Override
public void ope1() {
call();
}
@Override
public void ope2() {
System.out.println("适配器角色-新增的方法");
}
}
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
Target target = new Adapter();
target.ope1();
target.ope2();
}
}
对象适配器模式
此模式下,适配器角色实现目标角色对应的接口,持有一个源角色类型的属性,通过该属性来实现接口的方法。
// 前面2个角色代码是一样的
/**
* 适配器角色
*/
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void ope1() {
adaptee.call();
}
@Override
public void ope2() {
System.out.println("适配器角色-新增的方法");
}
}
/**
* 测试类
*/
public class Test {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
Target target = new Adapter(adaptee);
target.ope1();
target.ope2();
}
}
适用场景
- 想使用系统中已存在的类,但它的方法和需求不匹配
- 想创建一个可以复用的类,这个类需要和一些不兼容的类一起工作;这时候可以使用适配器模式,将不兼容的类适配成想要的