美文网首页设计模式
设计模式之禅-适配器模式

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

作者: 凉快先生 | 来源:发表于2020-12-23 17:03 被阅读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.对象适配器

    相关文章

      网友评论

        本文标题:设计模式之禅-适配器模式

        本文链接:https://www.haomeiwen.com/subject/wfqynktx.html