什么是适配器模式
适配器模式(Adapter Pattern)属于结构型模式,它将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原来由于不兼容而不能在一起工作的哪些类可以在一起工作。
模式中的角色
- 目标接口(Target):客户所期待的接口。目标可以是具体的和或抽象的类,也可以是接口。
- 需要适配的类(Adaptee):需要适配的类或适配者类。
- 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
应用场景
- 经常用来做旧系统改造和升级。
- java.io.InputStreamReader(InputStream)
- java.io.OutputStreamWriter(OutputStream)
举例说明
假设我们有一把PS/2接口的键盘(Adaptee),要用在我们的笔记本(Client)上,可我们的笔记本上只有USB接口(Traget),这时你直接将键盘插到笔记本上是不可能的了,原因很简单接口不一样啊,这时我们就需要如下图所示的适配器(Adapter)来解决我们的问题,有了它我们就可以在只有USB接口的笔记本上使用PS/2键盘了。
类图
代码
需要适配的类(Adaptee)
package com.match.adapter;
/**
* 被适配的类
* 相当于例子中的PS/2键盘
* @author Match
*
*/
public class Adaptee
{
private String ps_2IO;
public Adaptee()
{
this.ps_2IO = "PS/2键盘";
}
public void request()
{
System.out.println(ps_2IO);
}
}
目标接口(Target)
package com.match.adapter;
/**
* 相当于例子中的USB接口
* @author Match
*
*/
public interface Target
{
void handleReq();
}
适配器(Adapter)
类适配器方式:采用继承实现,由于Java是单继承,所以需要适配的类超过一个后就不在适用了。
package com.match.adapter;
/**
* 适配器类
* 类适配器方式:采用继承实现,由于Java是单继承,所以需要适配的类超过一个后就不在适用了
* 相当于USB和PS/2的转接器
* @author Match
*
*/
public class Adapter1 extends Adaptee implements Target
{
@Override
public void handleReq()
{
super.request();
}
}
对象适配器方式:采用了组合的方式跟被适配对象整合。
package com.match.adapter;
/**
* 适配器
* 对象适配器方式:使用了组合的方式跟被适配对象整合
* 相当于USB和PS/2的转接器
* @author Match
*
*/
public class Adapter2 implements Target
{
private Adaptee adaptee;
public Adapter2(Adaptee adaptee)
{
super();
this.adaptee=adaptee;
}
@Override
public void handleReq()
{
adaptee.request();
}
}
客户端类(Client)
package com.match.adapter;
/**
* 客户端类
* 相当于例子中的笔记本,只有USB接口
* @author Match
*
*/
public class Client
{
public void usbIO(Target usb)
{
usb.handleReq();
}
public static void main(String[] args)
{
Client c = new Client();
System.out.println("测试适配器一:");
Target usb1 = new Adapter1();
c.usbIO(usb1);
System.out.println("--------------------");
System.out.println("测试适配器二:");
Adaptee ps_2Key = new Adaptee();
Target usb2 = new Adapter2(ps_2Key);
c.usbIO(usb2);
}
}
测试控制台输出:
测试适配器一:
PS/2键盘
--------------------
测试适配器二:
PS/2键盘