设计模式-适配者模式

335 阅读2分钟

引言

今天是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();
    }
}

输出结果

我想知道去瘦西湖怎么走?

总结

适配器模式很好的解决了目标和适配者之间不匹配的问题。它适用于那些在使用第三方提供的组件时,其接口定义和自己所需要的接口定义不一致的问题。此外,适配器还可以拓展为双向适配器模式,只需要把适配者也定义为一个接口即可,在此不做赘述,有兴趣可自行实现。