设计模式系列:适配器模式

概念

适配器模式是将一个类的接口,转换成客户期望 的另一个接口。适配器让原来接口不兼容的类可以合作。

实现

  • 类图:

图片

对象适配器
图片

类适配器
图片

Target:

1
2
3
4
5
6
7
8
package com.littlehui.design.adapter.target;

/**
* Created by littlehui on 2017/11/9.
*/
public interface Target {
public void doTargetThings(String value);
}

Adapter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.littlehui.design.adapter.source;

import com.littlehui.design.adapter.target.Target;

/**
* Created by littlehui on 2017/11/9.
*/
public class Adapter implements Target {

Adaptee adaptee;

public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}

public void doTargetThings(String value) {
adaptee.doSourceThings(value);
}
}

Adaptee

1
2
3
4
5
6
7
8
9
10
package com.littlehui.design.adapter.source;

/**
* Created by littlehui on 2017/11/9.
*/
public class Adaptee {
public void doSourceThings(String value) {
System.out.println("value is : " + value + "adaptee");
}
}

ConcreteTarget

1
2
3
4
5
6
7
8
9
10
11
package com.littlehui.design.adapter.target;

/**
* Created by littlehui on 2017/11/9.
*/
public class ConcreteTarget implements Target {

public void doTargetThings(String value) {
System.out.println("value is:" + value);
}
}

Client:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.littlehui.design.adapter;

import com.littlehui.design.adapter.source.Adaptee;
import com.littlehui.design.adapter.source.Adapter;
import com.littlehui.design.adapter.target.ConcreteTarget;
import com.littlehui.design.adapter.target.Target;

/**
* Created by littlehui on 2017/11/9.
*/
public class Client {

public static void main(String[] args) {
Target target = new ConcreteTarget();
Target adaTarget = new Adapter(new Adaptee());
target.doTargetThings("意外");
adaTarget.doTargetThings("意外");
}
}

以上利用组合的方式,以修改的接口包装适配者。这种实现方式称之为对象的适配器。它带来的有点是:被适配者的任意子类,都可以搭配适配器使用。

场景

以Java举例,早先JDK里使用了枚举器(Enumeration)随着版本的更迭后来被 迭代器(Iterator)取代了。为了兼容之前的接口,枚举器仍然被保留着。
并且枚举器添加了删除元素的接口。如果遇到保留着 枚举器的客户端代码,依赖于枚举接口,完全可以使用适配器模式将迭代器转换成枚举。

总结

设计模式的原则有一条:组合优于继承。体现在适配器模式上就有两种适配方式。组合的称之为 对象时适配模式,继承的称之为对象适配模式。组合的有点是
不仅可以适配某个类,还可以适配这个类的子类属于垂直扩展。类适配器不需要重新实现整个适配者。必要的时候覆盖被适配行为就可以。两种各有优劣。站在
java的角度思考,类适配多更需要多继承的方式(虽然也可以用接口)。java不支持多继承。所以 建议使用对象适配。既组合。