模式概述:
它能使接口不兼容的对象能够相互合作。
使用场景:
- 当你希望使用某个类, 但是其接口与其他代码不兼容时, 可以使用适配器类。
- 如果您需要复用这样一些类, 他们处于同一个继承体系, 并且他们又有了额外的一些共同的方法, 但是这些共同的方法不是所有在这一继承体系中的子类所具有的共性。
代码样例:
代码背景: 假如你公司有个人力系统可以查看员工的信息,系统底层用户是一张表,直接查询数据库得到用户详情,然后返回需要的信息即可;后来你们公司业务扩展,人力紧张,这时你们公司找了外包,同样你们想看外包人员的信息,但是外包公司的员工底层是多张表,员工实体是多张表的封装,他们有用户详情接口,但是接口返回的数据你们并不能直接使用,此时使用适配进行解决
/**
* 本公司员工实体
*/
public class UserInfo {
private String name;
private int age;
private String idCard;
private String street;
private int roomNo;
private String motherName;
private String fatherName;
public UserInfo(String name, int age, String idCard, String street, int roomNo, String motherName, String fatherName) {
this.name = name;
this.age = age;
this.idCard = idCard;
this.street = street;
this.roomNo = roomNo;
this.motherName = motherName;
this.fatherName = fatherName;
}
public String getFatherName() {
return fatherName;
}
}
/**
* 源接口
*/
public interface UserInfoService {
/**
* 源目标方法
*/
public String getUserName();
}
/**
* 源接口实现
*/
public class UserInfoServiceImpl implements UserInfoService{
/**
* 源目标方法
*/
@Override
public String getUserName() {
UserInfo userInfo = new UserInfo("张三", 19, null, "北京路",22,
"李氏","张小二");//查询数据库得到用户详情
return userInfo.getFatherName();
}
}
/**
* 外包公司员工实体
*/
public class OutUserInfo {
private Map<String,Object> baseInfo;
private Map<String,Object> addressInfo;
private Map<String,Object> familyInfo;
public OutUserInfo(Map<String, Object> baseInfo, Map<String, Object> addressInfo, Map<String, Object> familyInfo) {
this.baseInfo = baseInfo;
this.addressInfo = addressInfo;
this.familyInfo = familyInfo;
}
public Map<String, Object> getFamilyInfo() {
return familyInfo;
}
}
**
* 待适配类
*/
public class OutUserInfoService {
/**
* 待适配方法
*/
public OutUserInfo queryUserInfo(){
Map<String,Object> baseInfo = new HashMap<>();
baseInfo.put("userName","李四");
baseInfo.put("userAge",20);
Map<String,Object> familyInfo = new HashMap<>();
familyInfo.put("fatherName","李寻欢");
OutUserInfo outUserInfo = new OutUserInfo(baseInfo,null,familyInfo);//查询数据库,得到外包人员
return outUserInfo;
}
}
/**
* 适配器
* 实现目标接口并继承待适配类
*/
public class UserAdapter extends OutUserInfoService implements UserInfoService {
/**
* 适配方法
*/
@Override
public String getUserName() {
return (String)super.queryUserInfo().getFamilyInfo().get("fatherName");
}
}
public class TestAdapter {
public static void main(String[] args) {
//原业务
UserInfoService userInfoService = new UserInfoServiceImpl();
System.out.println("老业务:"+userInfoService.getUserName());
//适配器
UserInfoService adapter = new UserAdapter();
System.out.println("适配器:"+adapter.getUserName());
}
}
测试结果: