适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
案例:公司业务需要将会请外包公司的员工一起开发新的项目,需要将外包人员的信息和本公司的人员的基础信息和家庭信息打印出来方便管理人员管理,然本公司的人员信息都存在一起的,外包公司的人员信息分开存储的,这时候需要外包公司人员的信息转化成我们公司的存储形式,不然没办法将信息打印出来。
本公司的人员存储信息
package com.zcm.adapter.entry;
import lombok.*;
import java.util.*;
/**
* @program: demo
* @ClassName:UserInfo
* @Description:
* @Author:zcm
* @Date:2021/2/20 15:03
*/
class UserInfo implements IUserInfo {
@Override
public List<User> getUserInfo() {
List<User> list=new ArrayList<>();
User user=new User();
user.setUserName("张三");
user.setMobile("15806043979");
user.setSex("女");
user.setEmail("15806043979@163.com");
user.setAddress("福州鼓楼融汇江山");
user.setHomeTel("4001-39201923");
list.add(user);
return list;
}
}
/**
* @program: demo
* @ClassName:IUserInfo
* @Description:
* @Author:zcm
* @Date:2021/2/20 14:51
*/
interface IUserInfo {
/**
* @Description:获取用户信息
* @Author: zcm
* @Version:v.2.7.1
* @Date:2021/2/20 14:55
*/
List<User> getUserInfo();
}
@Data
class User {
private String userName;
private String mobile;
private String address;
private String sex;
private String email;
private String homeTel;
}
外包公司人员存储信息
package com.zcm.adapter.entry;
import com.zcm.adapter.*;
import java.util.*;
/**
* @program: demo
* @ClassName:OutUserInfo
* @Description:
* @Author:zcm
* @Date:2021/2/20 15:18
*/
public class OutUserInfo implements IOutUserInfo {
@Override
public Map<String, String> getBaseUser() {
Map<String, String> baseMap = new HashMap<>();
baseMap.put("userName", "哪吒");
baseMap.put("mobile", "15203021989");
baseMap.put("sex", "男");
baseMap.put("email", "15203021989@163.com");
return baseMap;
}
@Override
public Map<String, String> getHomeUser() {
Map<String, String> homeMap = new HashMap<>();
homeMap.put("address", "福州鼓楼融汇江山");
homeMap.put("homeTel", "4009-80942314");
return homeMap;
}
}
interface IOutUserInfo {
/**
* @Description:基础信息
* @Author: zcm
* @Version:v.2.7.1
* @Date:2021/2/20 15:17
*/
Map<String, String> getBaseUser();
/**
* @Description:家庭信息
* @Author: zcm
* @Version:v.2.7.1
* @Date:2021/2/20 15:16
*/
Map<String, String> getHomeUser();
}
需要一个适配器外包公司的人员信息转成我们公司的存储形式
package com.zcm.adapter.entry;
import java.util.*;
/**
* @Description:适配器:系统人员和外部人员一起查出来
* @Author: zcm
* @Version:v.2.7.1
* @Date:2021/2/20 15:43
*/
public class OutUserAdapter extends OutUserInfo implements IUserInfo {
/**
* @Description:基础信息
* @Author: zcm
* @Version:v.2.7.1
* @Date:2021/2/20 15:38
*/
Map<String, String> baseUser = super.getBaseUser();
/**
* @Description:家庭信息
* @Author: zcm
* @Version:v.2.7.1
* @Date:2021/2/20 15:38
*/
Map<String, String> homeUser = super.getHomeUser();
/**
* @Description:关键转化方法
* @Author: zcm
* @Version:v.2.7.1
* @Date:2021/2/20 15:38
*/
@Override
public List<User> getUserInfo() {
List<User> users = new ArrayList<>();
User user = new User();
user.setUserName(baseUser.get("userName"));
user.setSex(baseUser.get("sex"));
user.setMobile(baseUser.get("mobile"));
user.setEmail(baseUser.get("email"));
user.setAddress(homeUser.get("address"));
user.setHomeTel(homeUser.get("homeTel"));
users.add(user);
return users;
}
}
查看转化结果
package com.zcm.adapter.entry;
import java.util.*;
/**
* @program: demo
* @ClassName:Client
* @Description:
* @Author:zcm
* @Date:2021/2/20 15:09
*/
public class Client {
public static void main(String[] args) {
IUserInfo userInfo = new UserInfo();
System.out.println("内部人员:---------------------------");
List<User> info = userInfo.getUserInfo();
info.forEach((user) -> {
System.out.println("姓名:" + user.getUserName());
System.out.println("性别:" + user.getSex());
System.out.println("手机号:" + user.getMobile());
System.out.println("邮箱:" + user.getEmail());
System.out.println("家庭地址:" + user.getAddress());
System.out.println("家庭电话:" + user.getHomeTel());
}
);
System.out.println("外部人员:----------------------------");
//适配器使用
userInfo = new OutUserAdapter();
userInfo.getUserInfo().forEach((user) -> {
System.out.println("姓名:" + user.getUserName());
System.out.println("性别:" + user.getSex());
System.out.println("手机号:" + user.getMobile());
System.out.println("邮箱:" + user.getEmail());
System.out.println("家庭地址:" + user.getAddress());
System.out.println("家庭电话:" + user.getHomeTel());
}
);
}
}
关系图
总结:适配器就是两个本质一样的东西表现形式有所差别通过适配器的转化让双方都可以使用对方的东西。例如说:手机数据线中的转换头,安卓线可以通过苹果转换头,让苹果手机充电,苹果数据线也可以通过安卓转换头让安卓手机充电,转换头就是适配器。