引言
今天是418旅游节,我也出门去玩玩,突然看到一个外国友人在问路,然而他问的那个人似乎听不懂他在说啥,我走上前去,凭着蹩脚的口语成功帮助了外国友人,感觉自己胸前的红领巾更亮了。
正文
适配器模式就是将原本两个不兼容的接口,通过某种方式使其能够共同工作。适配器模式也分为类结构性模式和对象结构性模式。前者相比后者耦合度高,并且需要开发者了解其内部的相关结构,故应用较少。
核心思想
通过适配器,开发者可以重用原有的代码,无需修改即可调用。同时将目标接口和适配者解耦,解决了目标接口和适配者不一致的问题。
代码实现
讲解
//目标接口
public interface Target {
public void request();
}
//适配者
public class Apdatee {
public void specificRequest(){
System.out.println("适配者的函数被调用");
}
}
//类适配器
public class Adapter extends Apdatee implements Target {
@Override
public void request() {
specificRequest();
}
}
//对象适配器
public class ObjectAdapter implements Target {
private Adaptee adaptee;
public ObjectAdapter(Adaptee adaptee){
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.specificRequest();
}
}
//调用
public class Client {
public static void main(String[] args) {
//类适配器模式
Target target = new Adapter();
target.request();
//对象适配器模式
Adaptee adaptee = new Adaptee();
Target target = new ObjectAdapter(adaptee);
target.request();
}
}
实例
在引言部分中,问路是目标,外国友人是适配者,我就充当的是适配器的角色,负责将外语翻译给路人听。
public interface AskWayTarget {
public void askWay();
}
public class ForeignerAdaptee {
public void specificAskWay(){
System.out.println("我想知道去瘦西湖怎么走?");
}
}
//类适配器
public class MeAdapter extends ForeignerAdaptee implements AskWayTarget {
@Override
public void askWay() {
specificAskWay();
}
}
//对象适配器
public class MeObjectAdapter implements AskWayTarget {
ForeignerAdaptee foreignerAdaptee ;
public MeObjectAdapter(ForeignerAdaptee adaptee){
this.foreignerAdaptee = adaptee;
}
@Override
public void askWay() {
foreignerAdaptee.specificAskWay();
}
}
public class Main {
public static void main(String[] args) {
//对象适配器模式
ForeignerAdaptee foreignerAdaptee = new ForeignerAdaptee();
MeObjectAdapter meObjectAdapter = new MeObjectAdapter(foreignerAdaptee);
meObjectAdapter.askWay();
//类适配器模式
AskWayTarget askWayTarget = new MeAdapter();
askWayTarget.askWay();
}
}
输出结果
我想知道去瘦西湖怎么走?
总结
适配器模式很好的解决了目标和适配者之间不匹配的问题。它适用于那些在使用第三方提供的组件时,其接口定义和自己所需要的接口定义不一致的问题。此外,适配器还可以拓展为双向适配器模式,只需要把适配者也定义为一个接口即可,在此不做赘述,有兴趣可自行实现。