简介
将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
UML图:
应用场景
- 系统需要使用现有的类,而这些类的接口不符合系统的需要
- java中的JDBC、InputStreamReader
示例
翻译员的主要工作也即是让语言不相同的人群也可以进行交流和沟通
- 对外的接口
public interface YesOrNotLanguage {
void sayYes();
void sayNo();
}
public class American implements YesOrNotLanguage {
@Override
public void sayYes() {
System.out.println("Yes!!!");
}
@Override
public void sayNo() {
System.out.println("No!No!");
}
}
public class Chinese {
public void 是的() {
System.out.println("是的");
}
public void 不儿() {
System.out.println("不儿,不儿");
}
}
- 适配器:翻译
public class Translator implements YesOrNotLanguage {
private Chinese chinese;
public Translator(Chinese chinese) {
this.chinese = chinese;
}
@Override
public void sayYes() {
chinese.是的();
}
@Override
public void sayNo() {
chinese.不儿();
}
}
- 运行
public class Main {
public static void main(String[] args) {
YesOrNotLanguage american = new American();
american.sayYes();
YesOrNotLanguage translator = new Translator(new Chinese());
translator.sayYes();
american.sayNo();
translator.sayNo();
}
}
示例2
将一些类转换成满足另一个新接口的类
- 目标类:需要有与要适配的类相同的方法进行覆盖重写
public interface NewCharger {
void highSpeed();
void mediumSpeed();
// 需要有与要适配的类相同的方法进行覆盖重写
void slowSpeed();
}
- 适配类
public class OldCharger {
public void slowSpeed(){
System.out.println("10w 快充");
}
}
- 适配器
public class ChargeAdaptor extends OldCharger implements NewCharger {
@Override
public void highSpeed() {
System.out.println("120w 快充");
}
@Override
public void mediumSpeed() {
System.out.println("60w 快充");
}
}
- 运行
public class Main {
public static void main(String[] args) {
NewCharger chargeAdaptor = new ChargeAdaptor();
chargeAdaptor.slowSpeed();
chargeAdaptor.mediumSpeed();
chargeAdaptor.highSpeed();
}
}
总结
好处:
- 可以让任何两个没有关联的类⼀起运行,使得原本接口不兼容的类也可以一起工作
- 提高代码可复用性和灵活性
缺点:
- 增加了整体的调用链路