专栏首页Java升级之路设计之禅——适配器模式

设计之禅——适配器模式

概述

对于适配器相信大家不会陌生,生活中有各种各样的例子,像耳机转接线,充电器适配器,水管适配接口等等。通过类比我们很容易理解适配器的作用:

将已有的本无法使用的类通过适配器转换,从而达到资源复用,节省开销的目的。

那要如何通过代码实现这一点呢?既然要将被适配者转换为目标接口类,那么适配器肯定是要实现自该接口的,以保证类型、行为的一致,但要如何转换呢?很简单,只需要通过继承或组合被适配者就能轻易的实现。注意基于多使用组合,少使用继承的原则,我们一般会选择组合的方式来实现,这种方式叫对象适配器,而通过继承实现的叫类适配器,后者一般用于一个适配器需要转换多个被适配者的情况;但Java中没有多继承,因此此处仅讨论对象适配器。类图如下:

Coding

小明有一台用肾换来的IPhone,某天IPhone的充电器坏了,但IPhone的充电器太贵,小明没钱买新的了,他想到之前的Android充电器还是好的,但是不兼容IPhone手机啊,不过小明知道网上有Android和IPhone的接口转换器卖,而且很便宜,立马就买了一个回来,完美解决,不用再卖肾了。我们就用代码来实现这个过程,首先是IPhone和Android: ···java public class IPhone {

// 注意IPhone充电器现在是不能正常工作的
public void iPhoneCharging() {
    System.out.println("充电器坏了。。。");
}

}

public class Andriod {

public void andriodCharging() {
    System.out.println("充电中....");
}

} ··· 可以看到这两个东西完全没有关联,但小明需要Android充电器和IPhone充电器一样为IPhone充电:

public class AndriodAdatper extends IPhone {

    private Andriod andriod;

    public AndriodAdatper(Andriod andriod) {
        this.andriod = andriod;
    }

    @Override
    public void iPhoneCharging() {
        andriod.andriodCharging();
    }

}

有了这个适配器小明就可以正常充电了:

public class XiaoMing {

    public static void main(String[] args) {
        Andriod andriod = new Andriod();
        IPhone iPhone = new AndriodAdatper(andriod);
        iPhone.iPhoneCharging();
    }

}

实现适配器非常容易,通过上述代码,我们也可以看到被适配者对于客户端而言是完全透明的,具体需要适配什么也是由客户端来决定的,通过适配器就将现有的接口类和被适配者完全解耦了,但是我们也可以发现每当需要转换一个类时都需要一个适配器,这样就会导致系统结构变得非常复杂,因此使用时也需要格外注意。

小结

适配器模式可以将一个不兼容的类转化为可复用的类,这样可以使得我们不用添加额外冗余臃肿的代码,但同时也会产生许多的适配器类,也会增加系统的复杂性。同时,既然是转换不兼容的类,那么该模式应尽可能的用于项目后期的补偿,而不是初期的详细设计中,否则就应该好好考虑下初期设计是否合理。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 这一次搞懂Spring的Bean实例化原理

    前两篇文章分析了Spring XML和注解的解析原理,并将其封装为BeanDefinition对象存放到IOC容器中,而这些只是refresh方法中的其中一个步...

    夜勿语
  • 设计之禅——访问者模式

    访问者模式是遵循单一职责原则,将行为和属性分离的一种设计模式,它可以在不改变元素结构的前提下定义元素新的操作。类比到现实当中就像博物馆,它是固定不变的,其中有各...

    夜勿语
  • 这一次搞懂Spring Web零xml配置原理以及父子容器关系

    在使用Spring和SpringMVC的老版本进行开发时,我们需要配置很多的xml文件,非常的繁琐,总是让用户自行选择配置也是非常不好的。基于约定大于配置的规定...

    夜勿语
  • Rafy 框架-发布网页版用户手册

    前段时间把 Rafy 的用户手册由 CHM 格式转换为了网页格式,而且发布到了 github.io 上,即方便文档的实时更新,也方便大家查看。 Rafy 用户手...

    用户1172223
  • 最近一百年,全球涌现过哪些最顶尖的、最赚钱的公司?它们的共性是什么?

    作者:挖数 来源:知乎,已获作者授权,拒绝二次转载 题主问的是最赚钱的公司,那应该从利润的维度看更合适。 以下是 2015年全球利润最高的25家公司,利润从...

    顶级程序员
  • Hyperledger Fabric 5 FABRIC COMPONENTS

    Hyperledger Fabric 4 execute-order-validate architecture

    安包
  • Java 集合排序规则接口 Comparator

    最近用到了集合排序(基于 Java 8)。现在我能用 Stream 的就用 Stream ,真香!排序可以这么写:

    码农小胖哥
  • Redis性能监控问题

    并发数上升,到底是哪个服务处理能力到了瓶颈,还是Redis性能到了瓶颈,只有找出是哪里的性能问题,才能对症下药。所以,了解redis的一些运维知识能够帮助我们快...

    Java艺术
  • 本周末的QQ群视频--还是电商网站的事

    主要讲了如何开发“点击某商品,进入商品详情页”。 产品列表页,就是这个电商网站的首页,也是一般多数电商网站的首页,在首页上尽量多的把商品展示出来。 一般来讲,它...

    web前端教室
  • 妙用CSS变量,让你的CSS变得更心动

    「CSS变量」又叫「CSS自定义属性」,为什么会突然提起这个很少人用到的东西呢?因为最近在重构个人官网,不知道为什么突然喜欢用上「CSS变量」,可能其自身隐藏的...

    JowayYoung

扫码关注云+社区

领取腾讯云代金券