目录
一、适配器模式(Adapter Pattern)的思想
思想:把一个类/接口转换为客户端期望的形式。
这样做的好处:
1.使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
2.通过增加一个接口,将已存在的子类封装起来,客户端面向接口编程,从而隐藏了具体子类。
二、适配器模式中的三个角色
- 目标(Target): 客户端期待得到的接口。
- 源(Adaptee):需要被适配的接口。
- 适配器(Adapter):连接目标和源,把源接口转换成期待的目标接口。
适配器模式包括3种形式:类适配器模式、对象适配器模式、接口适配器模式。本文主要介绍对象适配器。
三、对象适配器模式
在对象适配器模式中,目标ITarget是一个与客户端需求匹配的接口,适配器Adapter和源Adaptee之间是委派关系(delegation)。
以下面的代码为例:
客户端想调用LegacyRectangle中的方法,画出一个长方形。这个例子中LegacyRectangle类就是源。但是客户端想要传入的是左上角的顶点和右下角的顶点,而源Adaptee中的方法需要的参数是左上角的顶点,以及宽和高,出现了不适配。
class Client {
public display() {
new LegacyRectangle().display(x1, y1, x2, y2);//客户端想要传入左上角的顶点和右下角的顶点
}
}
class LegacyRectangle {
void display(int x1, int y1, int w, int h) {
... //源Adaptee中的方法需要的参数是左上角的顶点,以及宽和高
}
}
此时通过对象适配器模式,先增加一个接口shape ,这个接口与客户端的要求适配。(客户端对抽象接口编程,与LegacyRectangle隔离)
interface Shape
{
void display(int x1, int y1, int x2, int y2);
}
再用一个Rectangle类实现shape接口,此时Rectangle充当的是Adapter的角色,通过与LegacyRectangle类建立委派关系完成display方法的实现。
class Rectangle implements Shape {
void display(int x1, int y1, int x2, int y2) {
new LegacyRectangle().display(x1, y1, x2-x1, y2-y1); //通过委派完成display
}
}
此时客户端的代码实现如下:
class Client{
Shape shape = new Rectangle(); //客户端对抽象接口编程,与LegacyRectangle隔离
public display() {
shape.display(x1, y1, x2, y2);
}
}
可以看到,通过适配器Rectangle, 解决了LegacyRectangle与客户端期望形式不匹配的问题,实现了代码的复用。
总结
适配器模式的优点
代码复用:使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。可以复用已经实现的类的功能。
封装:通过增加一个接口,将已存在的子类封装起来,客户端面向接口编程,从而隐藏了具体子类。