适配器模式主要用于将两个由于不兼容而不能在一起工作的两个类通过适配器可以一起工作,比如通过USB转VGA的转接头,使没有VGA接口的电脑可以通过USB接口,通过转接头转接连上投影仪。
特别是在老系统升级中,此类使用会比较多。
适配器模式主要包含三个角色:
- Target(目标类):目标类定义客户所需的接口,可以是一个抽象类或接口,也可以是具体类。
- Adapter(适配器类):它可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配。它是适配器模式的核心。
- Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类包好了客户希望的业务方法。
主要实现方法:对象适配。
1、定义好Adaptee类,表示已经实现的方法。
package com.zwh.gof23.adapter;
/**
* @ClassName Adaptee
* @Description 适配者类,定义好了已经存在的方法。通过适配器进行调用,使用户可以访问到方法
* @Author zwh
* @Date 2018/11/28 23:11
* @Version 1.0
*/
public class Adaptee {
/**
* @Author zwh
* @Description 原有类中已经实现的方法,适配器来进行调用
* @Date 23:11 2018/11/28
* @Param []
* @return void
**/
public void project(){
System.out.println("投影仪已经实现的功能,连接投影仪进行投影!");
}
}
在本类中,定义一个project方法,表示已有的通过VGA接口投影的功能。
2、定义Target接口。
package com.zwh.gof23.adapter;
/**
* @ClassName Target
* @Description 定义用户调用的方法,在本例中定义转接方法
* @Author zwh
* @Date 2018/11/28 23:15
* @Version 1.0
*/
public interface Target {
/**
* @Author zwh
* @Description 转接方法,将usb接口转换为VGA接口
* @Date 23:16 2018/11/28
* @Param []
* @return void
**/
void transfor();
}
接口定义了转换的方法,在实际开发中,我们也主要是从这一步开始做。
3、定义适配器类,实现Target接口,并增加一个adaptee参数及构造器。用于告诉当前适配器,用户需要转换的目标接口。(用户需要访问的目标对象)
package com.zwh.gof23.adapter;
/**
* @ClassName Adapter
* @Description 适配器类,实现Target接口,实现USB到VGA的转换过程
* @Author zwh
* @Date 2018/11/28 23:17
* @Version 1.0
*/
public class Adapter implements Target{
private Adaptee adaptee;
@Override
public void transfor() {
System.out.println("我是适配器(转接头),usb连接我,我就可以转一个VGA接口连接到投影机");
adaptee.project();
}
public Adapter(Adaptee adaptee) {
System.out.println("告诉适配器(转接头),要转换为VGA接口");
this.adaptee = adaptee;
}
}
4、client测试:
package com.zwh.gof23.adapter;
/**
* @ClassName Client
* @Description 用户端,如本例中的笔记本电脑
* @Author zwh
* @Date 2018/11/28 23:18
* @Version 1.0
*/
public class Client {
public static void main(String[] args){
System.out.println("我是一台笔记本,我没有VGA接口,我想连接投影机!");
Adaptee adaptee=new Adaptee();
Target adapter=new Adapter(adaptee);
adapter.transfor();
}
}
在main方法中,创建一个Adaptee类的实例,用于告诉Adapter要转换的目标接口。通过Adapter进行转换。
最终输出结果:
我是一台笔记本,我没有VGA接口,我想连接投影机!
告诉适配器(转接头),要转换为VGA接口
我是适配器(转接头),usb连接我,我就可以转一个VGA接口连接到投影机
投影仪已经实现的功能,连接投影仪进行投影!
本此只讲了对象适配模式模式,可以看出主要是利用组合来实现的。其实还有类适配器模式(通过继承来实现)以及接口适配器模式(接口本身方法较多而又不完全需要,通过中间抽象方法进行过滤)。但一般用的较多的还是对象适配模式。类适配模式在java中因为只能单继承,所以当需要有其他目标对象时,无法进行扩展。