当前位置:网站首页 > 技术博客 > 正文

适配器模式解决什么问题



廖雪峰
资深软件开发工程师,业余马拉松选手。

将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

适配器模式是Adapter,也称Wrapper,是指如果一个接口需要B接口,但是待传入的对象却是A接口,怎么办?

我们举个例子。如果去美国,我们随身带的电器是无法直接使用的,因为美国的插座标准和中国不同,所以,我们需要一个适配器:

adapter

在程序设计中,适配器也是类似的。我们已经有一个类,实现了接口:

现在,我们想通过一个线程去执行它:

发现编译不过!因为接收接口,但不接收接口,肿么办?

一个办法是改写类,把实现的改为,但这样做不好,因为很可能在其他地方作为被引用,改写的接口,会导致其他正常工作的代码无法编译。

另一个办法不用改写类,而是用一个Adapter,把这个接口“变成”接口,这样,就可以正常编译:

这个类就是Adapter,它接收一个,输出一个。怎么实现这个呢?我们先看完整的代码:

编写一个Adapter的步骤如下:

  1. 实现目标接口,这里是;
  2. 内部持有一个待转换接口的引用,这里是通过字段持有接口;
  3. 在目标接口的实现方法内部,调用待转换接口的方法。

这样一来,Thread就可以接收这个,因为它实现了接口。作为调用方,它会调用的方法,在这个方法内部,又调用了的方法,相当于通过一层转换,间接调用了的方法。

适配器模式在Java标准库中有广泛应用。比如我们持有数据类型是,但是需要接口时,可以用一个Adapter:

注意到就相当于一个转换器,它可以把数组转换为。

我们再看一个例子:假设我们持有一个,希望调用方法,但它的参数类型是而不是,怎么办?

当然是使用适配器,把“变成”:

就是Java标准库提供的,它负责把一个适配为。类似的还有。

如果我们把方法参数从改为,会有什么问题?这个时候,因为我们需要一个类型,就必须把适配为:

直接使用这个Adapter是不行的,因为它只能转换出接口。事实上,要把转换为也不是不可能,但需要花费十倍以上的功夫。这时,面向抽象编程这一原则就体现出了威力:持有高层接口不但代码更灵活,而且把各种接口组合起来也更容易。一旦持有某个具体的子类类型,要想做一些改动就非常困难。

使用Adapter模式将接口适配为。

下载练习

Adapter模式可以将一个A接口转换为B接口,使得新的对象符合B接口规范。

编写Adapter实际上就是编写一个实现了B接口,并且内部持有A接口的类:

在Adapter内部将B接口的调用“转换”为对A接口的调用。

只有A、B接口均为抽象接口时,才能非常简单地实现Adapter模式。

版权声明


相关文章:

  • win10双硬盘双系统引导2025-01-15 14:29:59
  • 游戏测试工程师面试经验2025-01-15 14:29:59
  • redis集群是什么2025-01-15 14:29:59
  • 易支付源码最新版开源2025-01-15 14:29:59
  • 生成树详解2025-01-15 14:29:59
  • ai算法有哪些2025-01-15 14:29:59
  • .xml文件怎么注释2025-01-15 14:29:59
  • ipvsadm命令详解2025-01-15 14:29:59
  • 思科模拟器给交换机设置密码2025-01-15 14:29:59
  • 校园书房2025-01-15 14:29:59