设计模式-Adapter模式

适配器模式(Adapter Pattern)是结构型模式。主要用来解决接口不兼容的问题,将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

相关概念

  • 目标类(Target):定义客户所需接口,可以是一个抽象类或接口,也可以是具体类
  • 适配者(Adaptee):需要被适配的角色,它是已经存在的类或对象,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码
  • 适配器(Adapter):它的职责就是要把适配者转换成目标角色,对Adaptee和Target进行适配,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系

适配器模式分为两种:对象适配器、类适配器。

对象适配器

image
可以看到对象适配器非常类似之前的装饰器模式,都是通过组合/聚合来达到扩展的效果。

类适配器

image
类适配器通过继承/实现来扩展,需要考虑带来的耦合。

一个例子

我工作用的电脑是macbookpro,最近想外接一个显示器,等拿到显示器的时候才发现显示器里面给的接线并不能用在mac的lightning接口上。
因此我需要一个转接头。
image
例子中Target是上图中黄的type-c接口,Adaptee是上图中红色的lightning接口,整个转接头就是Adapter。

目标类

public interface TypeC {
    void useTypeCPort();
}

适配者类

public class Lightning {
    public void extent() {
        System.out.println("通过lightning接口外接显示器");
    }
}

对象适配器

public class PortObjectAdapter implements TypeC {
    private Lightning lightning;

    public PortObjectAdapter(Lightning lightning) {
        this.lightning = lightning;
    }

    @Override
    public void useTypeCPort() {
        System.out.println("使用type-c转接头");
        lightning.extent();
    }
}

类适配器

public class PortClassAdapter extends Lightning implements TypeC {
    @Override
    public void useTypeCPort() {
        System.out.println("使用type-c转接头");
        super.extent();
    }
}

使用

        //对象适配器
        System.out.println("----对象适配器----");
        Lightning lightning = new Lightning();
        PortObjectAdapter adapter = new PortObjectAdapter(lightning);
        adapter.useTypeCPort();
        //类适配器
        System.out.println("----类适配器----");
        PortClassAdapter adapter1 = new PortClassAdapter();
        adapter1.useTypeCPort();
----对象适配器----
使用type-c转接头
通过lightning接口外接显示器
----类适配器----
使用type-c转接头
通过lightning接口外接显示器

总结

  • 适配器模式比较简单,就是再不修改原来接口的情况下使其适应另一种接口需求。
  • 实际情况中,往往目标类和适配者类是已经存在的,这样就只需要额外引入一个适配器类即可。
  • 通过引入一个适配器类来将目标类和适配者类解耦。
  • 符合“开闭原则”,可以很方便的更换和新增适配器类。
  • 过度的使用会让系统变得很复杂,比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现。

你可以在这里获取相关代码:设计模式-Adapter模式

posted @ 2019-09-09 18:47  墨、鱼的blog  阅读(1722)  评论(0编辑  收藏  举报