23种设计模式-java-适配器

本文通过实例介绍了适配器模式的概念和使用场景,展示了如何在公司内部系统与外包公司系统不兼容时,利用适配器模式进行数据转换,使得两个系统能够顺利交互。适配器将外包公司的员工信息接口转换为公司内部系统可理解的格式,实现了不同接口之间的兼容性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模式概述:

它能使接口不兼容的对象能够相互合作。

使用场景:

  1. 当你希望使用某个类, 但是其接口与其他代码不兼容时, 可以使用适配器类。
  2. 如果您需要复用这样一些类, 他们处于同一个继承体系, 并且他们又有了额外的一些共同的方法, 但是这些共同的方法不是所有在这一继承体系中的子类所具有的共性。

代码样例:

代码背景: 假如你公司有个人力系统可以查看员工的信息,系统底层用户是一张表,直接查询数据库得到用户详情,然后返回需要的信息即可;后来你们公司业务扩展,人力紧张,这时你们公司找了外包,同样你们想看外包人员的信息,但是外包公司的员工底层是多张表,员工实体是多张表的封装,他们有用户详情接口,但是接口返回的数据你们并不能直接使用,此时使用适配进行解决

/**
 * 本公司员工实体
 */
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());


    }
}

测试结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值