适配器模式

插头转换问题

场景


不改变原代码基础上适配其他接口

代码

类适配器

采取继承方式

  • 适配器类实现目标类接口
  • 适配器类继承来源类
Sample
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
interface Src {
public void processSrc();
}

class SrcImpl extends Src {
@Override
public void processSrc() {
//...
}
}

interface Target {
public void processTarget();
}

class SrcTargetAdapter extends SrcImpl implements Target{
@Override
public void processTarget(){
processSrc();
}
}

使用

Sample
1
2
Target target = new SrcTargetAdapter();
target.processTarget();

对象适配器实现

采取组合的方式

  • 适配器类实现目标类接口
  • 适配器类包含来源类的实例
  • 让原对象提供新接口的实现
Sample
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
interface Src {
public void processSrc();
}

class SrcImpl extends Src {
@Override
public void processSrc() {
//...
}
}

interface Target {
public void processTarget();
}

class SrcTargetAdapter implements Target{
private Src src;
public SrcTargetAdapter(Src src){
this.src = src;
}

public void processTarget(){
src.processSrc();
}
}

使用

Sample
1
2
3
Src src = new SrcImpl();
Target target = new SrcTargetAdapter(src);
target.processTarget();

接口适配器

适配器抽象类空实现接口,这样使用时无需实现所有,只需要实现所需方法即可

Sample
1
2
3
4
5
6
7
8
9
10
11
12
13
14
interface Target {
public void target1();
public void target2();
public void target3();
}

abstract class TargetAdapter extends Target {
public void target1(){
}
public void target2(){
}
public void target3(){
}
}

使用

Sample
1
2
3
4
5
6
Target target = new TargetAdapter(){
@Override
public void target2(){
//...
}
}

优缺点

  • 方便外来代码集成

应用

  • java.io.InputStreamReader
    InputStreamReader继承Reader类,即把InputStream适配成了Reader

  • java.util.concurrent.Executors内部类RunnableAdapter
    把runnable转换成callable