设计模式(十三)—适配器模式
最后更新于:2022-04-01 16:26:20
**定义**:将一个类的接口变换成客户端所期待的的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
**适配器一般模式:**
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_5755340b0d43f.jpg)
Target角色:
该角色定义把其他类转换为何种接口,也就是我们的期望接口。
Adaptee源角色
你想把谁转换成目标角色,这个“谁”是原角色,它是已经存在的、运行良好的类或对象,经过Adapter包装,转换成一个全新的角色。
Adapter适配器角色
适配器模式的核心角色,适配器角色是需要新建立的。你想把谁转换成目标角色,就需要通过继承或者类关联的方式来操作。
~~~
public class AdapterPattern {
public static void main(String[] args) {
//原有的业务逻辑
Target target = new ConcreteTarget();
target.doSomething();
//增加了适配器角色后的业务逻辑
Target target2 = new Adapter();
target2.doSomething();
}
}
/**
* 目标角色,需要适配器所转换的目标的。
* @author admin
*
*/
interface Target{
//目标角色,所拥有的方法。
void doSomething();
}
class ConcreteTarget implements Target{
@Override
public void doSomething() {
System.out.println("我是目标角色,现在要使用我的...");
}
}
/**
* 源角色,适配器需要从这里转换。
* @author admin
*
*/
abstract class Adaptee{
public void doSome(){
System.out.println("我是源角色,从我这里转变...");
}
}
/**
* 适配器角色,将原角色转换成目标角色。
* @author admin
*
*/
class Adapter extends Adaptee implements Target{
@Override
public void doSomething() {
super.doSome();
}
}
~~~
## 一个例子:
已知A公司网站的员工信息规划分类是IUserInfo。而B公司网站的员工信息是IOuterUser。
B公司有一部分人员外派到A公司,并且需要将员工信息加入到A公司的员工信息网站中。这样由于两者的接口不同, 所以要用到---适配器模式。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_5755340b264c4.jpg)
~~~
public class AdapterTest {
public static void main(String[] args) {
//测试Adapter是否能用
IUserInfo userInfo = new UserAdapter();
//获取员工家庭电话
System.out.println(userInfo.getUserName()+"---"+userInfo.getHomeTelNumber());
}
}
/**
* A公司员工信息接口,是目标接口。
*/
interface IUserInfo {
//获取员工姓名
String getUserName();
//获取员工住址
String getUserAddress();
//获取员工联系方式
String getTelNumber();
//获取办公电话
String getOfficeTelNumber();
//获取职位名称
String getJobPosition();
//获取家庭电话
String getHomeTelNumber();
}
/**
* B公司外派人员的基本信息接口,是个源角色,待转换的角色。
* @author admin
*
*/
interface IOuterInfo{
//基本信息
HashMap<String, String> getUserBaseInfo();
//办公信息
HashMap<String, String> getOfficeInfo();
//家庭信息
HashMap<String, String> getHomeInfo();
}
/**
* B公司外派人员的实现接口。
* 他将一些具体信息分类,存储在Map集合中。
* @author admin
*
*/
class OuterInfo implements IOuterInfo{
/**
* 用户的基本信息
*/
@Override
public HashMap<String, String> getUserBaseInfo() {
HashMap<String, String> baseInfoMap = new HashMap<String, String>();
baseInfoMap.put("userName", "lzl");
baseInfoMap.put("mobileNumber", "18931373457");
return baseInfoMap;
}
@Override
public HashMap<String, String> getOfficeInfo() {
HashMap<String, String> officeInfoMap = new HashMap<String, String>();
officeInfoMap.put("officeTelNumber", "0332-24438");
officeInfoMap.put("jobPosition","ceo");
return officeInfoMap;
}
@Override
public HashMap<String, String> getHomeInfo() {
HashMap<String, String> homeInfoMap = new HashMap<String, String>();
homeInfoMap.put("address", "华尔街");
homeInfoMap.put("homeTelNumber", "6753443");
return homeInfoMap;
}
}
/**
* 转换角色,相当于Adapter,
* 主要将原角色转换成目标角色。
* @author admin
*
*/
class UserAdapter extends OuterInfo implements IUserInfo{
@Override
public String getUserName() {
String name = super.getUserBaseInfo().get("userName");
return name;
}
@Override
public String getUserAddress() {
String address = super.getHomeInfo().get("address");
return address;
}
@Override
public String getTelNumber() {
String telNumber = super.getUserBaseInfo().get("mobileNumber");
return telNumber;
}
@Override
public String getOfficeTelNumber() {
String officeTelNumber = super.getOfficeInfo().get("officeTelNumber");
return officeTelNumber;
}
@Override
public String getJobPosition() {
String jobPosition = super.getOfficeInfo().get("jobPosition");
return jobPosition;
}
@Override
public String getHomeTelNumber() {
String homeTelNumber = super.getHomeInfo().get("homeTelNumber");
return homeTelNumber;
}
}
~~~
## 适配器的扩展
B公司的员工设计表如果是这样的怎么实现?
通过类关联的方式实现适配器转换。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_5755340b46756.jpg)
~~~
public class AdapterTest {
public static void main(String[] args) {
//测试Adapter是否能用
IUserInfo userInfo = new UserAdapter(new BaseInfo(),new OfficeInfo(),new HomeInfo());
//获取员工家庭电话
System.out.println(userInfo.getUserName()+"---"+userInfo.getHomeTelNumber());
}
}
/**
* A公司员工信息接口,是目标接口。
*/
interface IUserInfo {
//获取员工姓名
String getUserName();
//获取员工住址
String getUserAddress();
//获取员工联系方式
String getTelNumber();
//获取办公电话
String getOfficeTelNumber();
//获取职位名称
String getJobPosition();
//获取家庭电话
String getHomeTelNumber();
}
/**
* B公司外派人员的基本信息接口,是个源角色,待转换的角色。
* @author admin
*
*/
interface IBaserInfo{
//基本信息
HashMap<String, String> getUserBaseInfo();
}
/**
* B公司外派人员的办公信息接口,是个源角色,待转换的角色。
* @author admin
*
*/
interface IOfficeUserInfo{
//办公信息
HashMap<String, String> getOfficeInfo();
}
/**
* B公司外派人员的家庭信息接口,是个源角色,待转换的角色。
* @author admin
*
*/
interface IHomeInfo{
//家庭信息
HashMap<String, String> getHomeInfo();
}
/**
* B公司外派人员的实现接口。
* 他将一些具体信息分类,存储在Map集合中。
* @author admin
*
*/
class BaseInfo implements IBaserInfo{
/**
* 用户的基本信息
*/
@Override
public HashMap<String, String> getUserBaseInfo() {
HashMap<String, String> baseInfoMap = new HashMap<String, String>();
baseInfoMap.put("userName", "lzl");
baseInfoMap.put("mobileNumber", "18931373457");
return baseInfoMap;
}
}
/**
* B公司外派人员的实现接口。
* 他将一些办公信息分类,存储在Map集合中。
* @author admin
*
*/
class OfficeInfo implements IOfficeUserInfo{
@Override
public HashMap<String, String> getOfficeInfo() {
HashMap<String, String> officeInfoMap = new HashMap<String, String>();
officeInfoMap.put("officeTelNumber", "0332-24438");
officeInfoMap.put("jobPosition","ceo");
return officeInfoMap;
}
}
/**
* B公司外派人员的实现接口。
* 他将一些家庭信息分类,存储在Map集合中。
* @author admin
*
*/
class HomeInfo implements IHomeInfo{
@Override
public HashMap<String, String> getHomeInfo() {
HashMap<String, String> homeInfoMap = new HashMap<String, String>();
homeInfoMap.put("address", "华尔街");
homeInfoMap.put("homeTelNumber", "6753443");
return homeInfoMap;
}
}
/**
* 转换角色,相当于Adapter,
* 主要将原角色转换成目标角色。
* @author admin
*
*/
class UserAdapter implements IUserInfo{
private BaseInfo baseInfo;
private OfficeInfo officeInfo;
private HomeInfo homeInfo;
private HashMap<String, String> baseInfoMap;
private HashMap<String, String> officeInfoMap;
private HashMap<String, String> homeInfoMap;
public UserAdapter(BaseInfo baseInfo ,OfficeInfo officeInfo,HomeInfo homeInfo) {
this.baseInfo = baseInfo;
this.officeInfo = officeInfo;
this.homeInfo = homeInfo;
this.baseInfoMap = this.baseInfo.getUserBaseInfo();
this.officeInfoMap = this.officeInfo.getOfficeInfo();
this.homeInfoMap = this.homeInfo.getHomeInfo();
}
@Override
public String getUserName() {
String name = this.baseInfoMap.get("userName");
return name;
}
@Override
public String getUserAddress() {
String address = this.homeInfoMap.get("address");
return address;
}
@Override
public String getTelNumber() {
String telNumber = this.baseInfoMap.get("mobileNumber");
return telNumber;
}
@Override
public String getOfficeTelNumber() {
String officeTelNumber = this.officeInfoMap.get("officeTelNumber");
return officeTelNumber;
}
@Override
public String getJobPosition() {
String jobPosition = this.officeInfoMap.get("jobPosition");
return jobPosition;
}
@Override
public String getHomeTelNumber() {
String homeTelNumber = this.homeInfoMap.get("homeTelNumber");
return homeTelNumber;
}
}
~~~