适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
UML图:
适配器的意义在于,就是为了将已存在的东西(接口)转换成适合我们的需要、能被我们所利用。非常形象的比喻:就像生活中的手机充电器,电脑的电源适配器一样。适配器就行Client和Target的中间件。
代码实现:
普通接口
public class ConcreteTarget implements Target{
@Override
public void request() {
System.out.println("普通类 ...");
}
}
//目标接口
interface Target {
public void request();
}
特殊接口:
public class Adapter {
public void specificAdapter() {
System.out.println("适配器模式特殊接口...");
}
}
所以我们要实现普通和特殊的功能,
class Adapter extends Adaptee implements Target{
public void request() {
super.specificRequest();
}
}
测试
public class Client {
public static void main(String[] args) {
// 使用普通功能类
Target concreteTarget = new ConcreteTarget();
concreteTarget.request();
// 使用特殊功能类,即适配类
Target adapter = new Adapter();
adapter.request();
}
}
小结
优势
- 使用对象组合的方式,用修改的接口来包装适配者
- 被适配者的任何子类也可以搭配适配器使用
- 个人觉得使用适配器最大的好处是 不需要修改客户端以及被适配者的代码。
- 需要实现所有的方法去完成适配,如果目标非常大,那么工作量也比较大。
NOTE:之前提到的都是 对象适配器,另外还有一种叫做 类适配器,不过类适配器需要多重继承去实现(Adapter需要继承Target和Adaptee),而不是组合的方式去实现。
适配器 装饰者 外观模式的不同:
适配器是:将一个接口转成另一个接口 装饰者是:不改变接口,但加入新的责任 外观模式是:让接口更简单