设计模式

设计模式之禅-适配器模式

2020-12-23  本文已影响0人  凉快先生

Target 是一个类(接口),Adaptee 是一个接口,通过 Adapter 把 Adaptee 包装成 Target 的一个子类(实现类)。

1.业务背景

公司的人力资源系统,用户表结构如1-1,现在公司需要从外面借调一批人进来(外包),需要把这些人的信息从外包公司导入自己的人力资源系统,但外包公司的人力用户表如图1-2。结构完全不一样,这时候就需要在中间失业适配器,将外包的人员信息转换成自己的人员信息。

1-1 1-2

2.代码实现

//用户信息对象

public interface IUserInfo {

//获得用户姓名

public String getUserName();

//获得家庭地址

public String getHomeAddress();

//手机号码,这个太重要,手机泛滥呀

public String getMobileNumber();

//办公电话,一般式座机

public String getOfficeTelNumber();

//这个人的职位是啥

public String getJobPosition();

//获得家庭电话

public String getHomeTelNumber();

}

接口实现:

public class UserInfo implements IUserInfo {

/*

* 获得家庭地址

*/

public String getHomeAddress() {

System.out.println("这里是员工的家庭地址....");

return null;

}

/*

* 获得家庭电话号码

*/

public String getHomeTelNumber() {

System.out.println("员工的家庭电话是....");

return null;

}

/*

* 员工的职位

*/

public String getJobPosition() {

System.out.println("这个人的职位是BOSS....");

return null;

}

/*

* 手机号码

*/

public String getMobileNumber() {

System.out.println("这个人的手机号码是0000....");

return null;

}

/*

* 办公室电话

*/

public String getOfficeTelNumber() {

System.out.println("办公室电话是....");

return null;

}

/*

* 姓名

*/

public String getUserName() {

System.out.println("姓名叫做...");

return null;

}

}

应用如何调用 UserInfo 的信息:

public class App {

public static void main(String[] args) {

//没有与外系统连接的时候,是这样写的

IUserInfo youngGirl = new UserInfo();

//从数据库中查到101个

for(int i=0;i<101;i++){

youngGirl.getMobileNumber();

}

}

}

外系统的人员信息:

public interface IOuterUser {

//基本信息,比如名称,性别,手机号码了等

public Map getUserBaseInfo();

//工作区域信息

public Map getUserOfficeInfo();

//用户的家庭信息

public Map getUserHomeInfo();

}

看外系统的用户信息的具体实现类:

public class OuterUser implements IOuterUser {

/*

* 用户的基本信息

*/

public Map getUserBaseInfo() {

HashMap baseInfoMap = new HashMap();

baseInfoMap.put("userName", "这个员工叫混世魔王....");

baseInfoMap.put("mobileNumber", "这个员工电话是....");

return baseInfoMap;

}

/*

* 员工的家庭信息

*/

public Map getUserHomeInfo() {

HashMap homeInfo = new HashMap();

homeInfo.put("homeTelNumbner", "员工的家庭电话是....");

homeInfo.put("homeAddress", "员工的家庭地址是....");

return homeInfo;

}

/*

* 员工的工作信息,比如职位了等

*/

public Map getUserOfficeInfo() {

HashMap officeInfo = new HashMap();

officeInfo.put("jobPosition","这个人的职位是BOSS...");

officeInfo.put("officeTelNumber", "员工的办公电话是....");

return officeInfo;

}

}

把外系统的用户信息包装成我们公司的人员信息

public class OuterUserInfo extends OuterUser implements IUserInfo {

private Map baseInfo = super.getUserBaseInfo(); //员工的基本信息

private Map homeInfo = super.getUserHomeInfo(); //员工的家庭 信息

private Map officeInfo = super.getUserOfficeInfo(); //工作信息

/*

* 家庭地址

*/

public String getHomeAddress() {

String homeAddress = (String)this.homeInfo.get("homeAddress");

System.out.println(homeAddress);

return homeAddress;

}

/*

* 家庭电话号码

*/

public String getHomeTelNumber() {

String homeTelNumber = (String)this.homeInfo.get("homeTelNumber");

System.out.println(homeTelNumber);

return homeTelNumber;

}

/*

*职位信息

*/

public String getJobPosition() {

String jobPosition = (String)this.officeInfo.get("jobPosition");

System.out.println(jobPosition);

return jobPosition;

}

/*

* 手机号码

*/

public String getMobileNumber() {

String mobileNumber = (String)this.baseInfo.get("mobileNumber");

System.out.println(mobileNumber);

return mobileNumber;

}

/*

* 办公电话

*/

public String getOfficeTelNumber() {

String officeTelNumber = (String)this.officeInfo.get("officeTelNumber");

System.out.println(officeTelNumber);

return officeTelNumber;

}

/*

* 员工的名称

*/

public String getUserName() {

String userName = (String)this.baseInfo.get("userName");

System.out.println(userName);

return userName;

}

}

调用外部的员工

public static void main(String[] args) {

//没有与外系统连接的时候,是这样写的

//IUserInfo youngGirl = new UserInfo();

//老板一想不对呀,兔子不吃窝边草,还是找人力资源的员工好点

IUserInfo youngGirl = new OuterUserInfo(); 

//从数据库中查到101个

for(int i=0;i<101;i++){

youngGirl.getMobileNumber();

}

}

使用了适配器模式只修改了一句话,其他的业务逻辑都不用修改就解决了系统对接的问题,

而且在我们实际系统中只是增加了一个业务类的继承,就实现了可以查本公司的员工信息,也可以查人力

资源公司的员工信息,尽量少的修改,通过扩展的方式解决了该问题。

适配器模式分为类适配器和对象适配器,上边的例子就是类适配器。

3.对象适配器

上一篇下一篇

猜你喜欢

热点阅读