一、核心作用

将一个类的接口转换为客户希望的接口

使原本接口不兼容而不能一起工作的类可以在一起工作

二、常见应用场景:

1、java.io.InputStreamReader(InputStream)

2、java.io.OutputStreamWriter(OutputStream)

三、适配器模式角色

• 目标角色(target):这是客户期待的接口,目标可以是具体的或抽象类,也可以是接口
• 适配器角色(adpater):将已有接口转换为目标接口
• 被适配者角色(adpatee):已有接口,但是与客户所期待的接口不兼容

四、适配器分类

1、类适配器模式:

2、对象适配器模式

五、代码示例:

一、类适配器模式:
目标对象:
package com.hezeu.adapter;

/**
* @Classname Target
* @Description 目标接口
* @Date 2020/2/22 下午 03:52
* @Created by 朱进博 1724282894@qq.com
*/
public interface Target {
void handleReq();
}
类适配器:
package com.hezeu.adapter;

/**
* @Classname Adapter
* @Description 适配器(类适配器)
* @Date 2020/2/22 下午 03:57
* @Created by 朱进博 1724282894@qq.com
*/
public class Adapter extends Adaptee implements Target{

@Override
public void handleReq() {
super.request();
}
}
被适配者:
package com.hezeu.adapter;

/**
* @Classname Adaptee
* @Description 被适配类
* @Date 2020/2/22 下午 03:54
* @Created by 朱进博 1724282894@qq.com
*/
public class Adaptee {
public void request(){
System.out.println("可以完成客户请求的需要的功能!");
}
}
二、对象适配器模式:
对象适配器:
package com.hezeu.adapter;

/**
* @Classname Adapter02
* @Description 适配器(对象适配器)
* @Date 2020/2/22 下午 04:10
* @Created by 朱进博 1724282894@qq.com
*/
public class Adapter02 implements Target{
private Adaptee adaptee;

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

@Override
public void handleReq() {
adaptee.request();
}
}

六、类适配器模式和对象适配器模式对比

优点:

类适配器模式:由于adapter类是适配者adaptee类的子类,因此可以在适配器中置换一些适配者的方法,使适配器的灵活性更强

对象适配器模式:一个对象适配器可以把多个不同的适配者adaptee适配到一个目标,也就是说,同一个适配器可以将适配者类和他的子类都适配到目标接口

缺点:

**类适配器:**不支持多继承,适配者类只有一个

对象适配器:想要修改适配者类的一个或多个方法,只好创建一个继承与适配者类的子类,把适配者方法置换掉,然后把适配者的子类当作真正的适配者进行适配,实现过程较为复杂

七、使用适配器模式的优缺点

优点:


  • 复用性:系统需要使用已经存在的类,功能符合系统要求,但是类的接口不符合系统要求,通过适配器可以解决不兼容问题,使这些功能得到复用
  • 扩展性:适配器使得系统多了一个方式扩展系统的功能
  • 耦合性:一定程度上解耦

缺点:

  • 过多的使用适配器,增加系统的理解成度