【图解设计模式】Adapter模式

用于填补“现有的程序”和“所需的程序”之间差异。

Adapter模式有以下两种:

  • 类适配器模式(使用继承的适配器)
  • 对象适配器模式(使用委托的适配器)

示例

将输入的字符串显示为(Hello)或是*Hello*。

类适配器模式(使用继承)

类图

C4drVI.png

Banner类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Banner {
private String string;

public Banner(String string){
this.string = string;
}

public void showWithParen(){
System.out.println("(" + string + ")");
}

public void showWithAster(){
System.out.println("*" + string + "*");
}
}

Print接口

1
2
3
4
public interface Print {
void printWeak();
void printStrong();
}

PrintBanner类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class PrintBanner extends Banner implements Print {
public PrintBanner(String string) {
super(string);
}

@Override
public void printWeak() {
showWithParen();
}

@Override
public void printStrong() {
showWithAster();
}
}

Main类

1
2
3
4
5
6
7
8
public class Main {

public static void main(String[] args) {
Print p = new PrintBanner("Hello");
p.printWeak();
p.printStrong();
}
}

运行结果

1
2
(Hello)
*Hello*

对象适配器模式(使用委托)

类图

C4wiRO.png

Print类

1
2
3
4
public abstract class Print {
abstract void printWeak();
abstract void printStrong();
}

PrintBanner类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class PrintBanner extends Print {
private Banner banner;

public PrintBanner(String string) {
this.banner = new Banner(string);
}

@Override
void printWeak() {
banner.showWithParen();
}

@Override
void printStrong() {
banner.showWithAster();
}
}

登场角色

在类适配器模式中,Adapter角色通过继承来使用Adaptee角色,而在对象适配器模式中,Adapter角色通过委托来使用Adaptee角色。

Targer(对象)

该角色负责定义所需的方法。在示例程序中,由Print接口(使用继承时)和Print类(使用委托时)扮演此角色。

Client(请求者)

该角色负责使用Target角色所定义的方法进行具体处理。在示例程序中,由Main类扮演此角色。

Adaptee(被适配)

Adaptee是一个持有既定方法的角色。在示例程序中,由Banner类扮演此角色。

Adapter(适配)

Adapter模式的主人公。使用Adaptee角色的方法来满足Target角色的需求,这是Adapter模式的目的,也是Adapter角色的作用。在示例程序中,由PrintBanner类扮演这个角色。

类适配器模式的类图(使用继承)

C40tje.png

对象适配器模式的类图(使用委托)

C40aBd.png