定义:将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
同样的我们先来看一个类图
这里主要涉及到三个角色:
1 . Target目标角色:该角色定义把其他类转换为何种接口,也就是我们的期望接口。
2 . Adaptee源角色:就是被适配的那个接口
3 . Adapter适配器角色:适配器模式中的核心角色,其他两个角色都是已经存在的角色,而适配器角色是需要新建立的,他的职责非常简单:把源角色转换为目标角色。怎么转换?通过继承或类关联的方式。
这里要解释一点,上面的类图表示的是适配器的一种类型,是采用类间继承的方式,所以叫做类适配器。我们先来看一下类适配器的通用源码吧。
1 . 目标角色
public interface Target {
//目标角色有自己的方法
public void request();
}
2 . 目标角色的实现类
public class ConcreteTarget implements Target {
public void request() {
System.out.println("I have nothing to do. if you need any help,pls call me!"); }
}
3 . 源角色
public class Adaptee {
//原有的业务逻辑
public void doSomething(){
System.out.println("I'm kind of busy,leave me alone,pls!");
}
}
4 . 适配器角色
public class Adapter extends Adaptee implements Target {
public void request() {
super.doSomething();
}
}
5 . 场景类
public class Client {
public static void main(String[] args) {
//原有的业务逻辑
Target target = new ConcreteTarget();
target.request();
//现在增加了适配器角色后的业务逻辑
Target target2 = new Adapter();
target2.request();
}
}
这里,我们想一个问题,就是说,如果我待适配不止一个接口那该怎么办,java是不支持多继承的,其实答案在一开始有提到过那就是通过类关联(组合)的形式表达。下面给一个示例方便大家理解。
1 . 多个待适配接口
public interface IOuterUserBaseInfo {
//基本信息,比如名称,性别,手机号码了等
public Map<?, ?> getUserBaseInfo();
}
public interface IOuterUserHomeInfo {
//用户的家庭信息
public Map<?, ?> getUserHomeInfo();
}
public interface IOuterUserOfficeInfo {
//工作区域信息
public Map<?, ?> getUserOfficeInfo();
}
2 . 实现待适配接口
public class OuterUserBaseInfo implements IOuterUserBaseInfo {
/*
* 用户的基本信息
*/
public Map<String, String> getUserBaseInfo() {
HashMap<String, String> baseInfoMap = new HashMap<String, String>();
baseInfoMap.put("userName", "这个员工叫混世魔王....");
baseInfoMap.put("mobileNumber", "这个员工电话是....");
return baseInfoMap;
}
}
public class OuterUserHomeInfo implements IOuterUserHomeInfo {
/*
* 员工的家庭信息
*/
public Map<String, String> getUserHomeInfo() {
HashMap<String, String> homeInfo = new HashMap<String, String>();
homeInfo.put("homeTelNumbner", "员工的家庭电话是....");
homeInfo.put("homeAddress", "员工的家庭地址是....");
return homeInfo;
}
}
public class OuterUserOfficeInfo implements IOuterUserOfficeInfo {
/*
* 员工的工作信息,比如职位了等
*/
public Map<String, String> getUserOfficeInfo() {
Map<String, String> officeInfo = new HashMap<String, String>();
officeInfo.put("jobPosition","这个人的职位是BOSS...");
officeInfo.put("officeTelNumber", "员工的办公电话是....");
return officeInfo;
}
}
3 . 适配器
@SuppressWarnings("all")
public class OuterUserInfo implements IUserInfo {
//源目标对象
private IOuterUserBaseInfo baseInfo = null; //员工的基本信息
private IOuterUserHomeInfo homeInfo = null; //员工的家庭 信息
private IOuterUserOfficeInfo officeInfo = null; //工作信息
//数据处理
private Map baseMap = null;
private Map homeMap = null;
private Map officeMap = null;
//构造函数传递对象
public OuterUserInfo(IOuterUserBaseInfo _baseInfo,IOuterUserHomeInfo _homeInfo,IOuterUserOfficeInfo _officeInfo){
this.baseInfo = _baseInfo;
this.homeInfo = _homeInfo;
this.officeInfo = _officeInfo;
//数据处理
this.baseMap = this.baseInfo.getUserBaseInfo();
this.homeMap = this.homeInfo.getUserHomeInfo();
this.officeMap = this.officeInfo.getUserOfficeInfo();
}
//家庭地址
public String getHomeAddress() {
String homeAddress = (String)this.homeMap.get("homeAddress");
System.out.println(homeAddress);
return homeAddress;
}
//家庭电话号码
public String getHomeTelNumber() {
String homeTelNumber = (String)this.homeMap.get("homeTelNumber");
System.out.println(homeTelNumber);
return homeTelNumber;
}
//职位信息
public String getJobPosition() {
String jobPosition = (String)this.officeMap.get("jobPosition");
System.out.println(jobPosition);
return jobPosition;
}
//手机号码
public String getMobileNumber() {
String mobileNumber = (String)this.baseMap.get("mobileNumber");
System.out.println(mobileNumber);
return mobileNumber;
}
//办公电话
public String getOfficeTelNumber() {
String officeTelNumber = (String)this.officeMap.get("officeTelNumber");
System.out.println(officeTelNumber);
return officeTelNumber;
}
// 员工的名称
public String getUserName() {
String userName = (String)this.baseMap.get("userName");
System.out.println(userName);
return userName;
}
}
4 . 场景类
public class Client {
public static void main(String[] args) {
//外系统的人员信息
IOuterUserBaseInfo baseInfo = new OuterUserBaseInfo();
IOuterUserHomeInfo homeInfo = new OuterUserHomeInfo();
IOuterUserOfficeInfo officeInfo = new OuterUserOfficeInfo();
//传递三个对象
IUserInfo youngGirl = new OuterUserInfo(baseInfo,homeInfo,officeInfo);
//从数据库中查到101个
for(int i=0;i<101;i++){
youngGirl.getMobileNumber();
}
}
}
最后总结下,适配器总共有两种,类适配器和对象适配器。