Fork me on GitHub

设计模式之适配器模式

设计模式之适配器模式

1. 什么是适配器模式

Adapter模式也叫适配器模式,是构造型模式之一,通过Adapter模式可以改变已有类(或外部类)的接口形式。就是将一个类的接口转换成另一个接口,让原本接口不兼容的类可以兼容。

从用户的角度是看不到被适配者的,是解耦的,用户只是调用了适配器转换出来的目标接口方法。

适配器模式的一般的使用场景:

在大规模的系统开发过程中,我们常常碰到诸如以下这些情况:我们需要实现某些功能,这些功能已有还不太成熟的一个或多个外部组件,如果我们自己重新开发这些功能会花费大量时间;所以很多情况下会选择先暂时使用外部组件,以后再考虑随时替换。但这样一来,会带来一个问题,随着对外部组件库的替换,可能需要对引用该外部组件的源代码进行大面积的修改,因此也极可能引入新的问题等等。如何最大限度的降低修改面呢?Adapter模式就是针对这种类似需求而提出来的。Adapter模式通过定义一个新的接口(对要实现的功能加以抽象),和一个实现该接口的Adapter(适配器)类来透明地调用外部组件。这样替换外部组件时,最多只要修改几个Adapter类就可以了,其他源代码都不会受到影响。

适配器模式有两种实现的方式:

  • 类适配器(继承实现)

通过多重继承目标接口和被适配者类方式来实现适配。

多重继承,其中继承的目标接口部分达到适配目的,而继承被适配者类的部分达到通过调用被适配者类里的方法来实现目标接口的功能。但是java是不支持多重继承的,但是可以继承类然后继承接口,算是间接的实现了多重继承吧。

1

  • 对象适配器(委让实现)

    对象适配器和类适配器使用了不同的方法实现适配,对象适配器使用组合,类适配器使用继承.

    2

2. 具体实例

适配器的话其实向转换器,比如usb转type C这样子的。

这个举一个项目的例子:用火鸡冒充鸭子。

就是外在是鸭子,其实内在是火鸡,就是用火鸡冒充鸭子。

首先通过类对象适配器的方式来实现

1
2
3
4
public interface Turkey {
public void gobble();
public void fly();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class WildTurkey implements Turkey {

@Override
public void gobble() {
// TODO Auto-generated method stub
System.out.println(" Go Go");
}

@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I am flying a short distance");
}
}

Duck的实现同理

对象适配器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class TuckeyAdapter implements Duck{
private Turkey turkey;
public TuckeyAdapter(Turkey turkey){
this.turkey = turkey;
}
@Override
public void quack() {
turkey.gobble();
}

@Override
public void fly() {
turkey.fly();
turkey.fly();
turkey.fly();
}
}

类适配器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class TurkeyAdapter2 extends WildTurkey implements Duck {

@Override
public void quack() {
// TODO Auto-generated method stub
super.gobble();
}
@Override
public void fly() {
// TODO Auto-generated method stub
super.fly();
super.fly();
super.fly();
}
}

通过上面两种适配器模式其实我们就实现了火鸡冒充鸭子。

对象适配器模式其实是通过使用对象组合,以修改的接口去包装被适配者,所以他不仅可以适配某个类,而且可以适配该类的任何子类;而类适配器需要多重的继承。

其实就是改了下外在,但是内在不变,有点像装饰者模式哈,因为就像给火鸡做了一层外包装。但是装饰者模式和适配器模式还是不一样的,一方面装饰者模式是可以继承和嵌套超类的,但是这里的适配器模式是只能继承某一接口,并且适配器模式是接口功能的改变,不能扩展,但是装饰者模式是为了实现某些功能的扩展,举个例子吧,比如usb转换器这个东西,我们要给他添加什么电容保护什么功能的时候用装饰者模式,然后我们要将其转换成type C 的接口就要用适配器模式,也就是让他适配type C的功能模式。

3. 从枚举器到迭代器的适配

java的老版本中有枚举器,现在改成了迭代器,就是有一些类似于Collection,HashMap这种高级的数据结构的遍历使用的迭代器。

为了老代码的好维护,需要从枚举器到迭代器的适配。只不过枚举器中没有remove()方法,就直接抛出异常了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class EnumerationIterator implements Iterator<Object> {

private Enumeration enumeration;

public EnumerationIterator(Enumeration enumeration)
{
this.enumeration= enumeration;
}

@Override
public boolean hasNext() {
// TODO Auto-generated method stub
return enumeration.hasMoreElements();
}

@Override
public Object next() {
// TODO Auto-generated method stub
return enumeration.nextElement();
}

@Override
public void remove() {
// TODO Auto-generated method stub
throw new UnsupportedOperationException();
}
}

本文标题:设计模式之适配器模式

文章作者:WilsonSong

发布时间:2018年10月17日 - 08:10

最后更新:2018年10月17日 - 08:10

原始链接:https://songwell1024.github.io/2018/10/17/AdapterMode/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------