设计模式——适配器模式

本文详细介绍了设计模式中的适配器模式,解释了其定义、优点及使用场景,并通过一个案例展示了如何在Java中应用适配器模式解决不同接口不匹配的问题,强调了适配器模式在保持类间解耦、增加透明性和提高复用性上的作用。

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

《Head First 设计模式》《设计模式之禅(第二版)》 学习笔记,码云同步更新中

如有错误或不足之处,请一定指出,谢谢~

目录
设计原则
设计模式
适配器模式(Adapter Pattern)
定义
  • 将一个接口转换成客户希望的另一个接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作
优点
  • 可以让两个没有任何关系的类一起运行,让目标类和适配类实现解耦
  • 增加了类的透明性
  • 提高了类的复用度
  • 具有非常好的灵活性
使用场景
  • 系统需要使用已经投入使用的类,但这些类不符合需求
案例

原本系统中有本公司员工信息的IUserInfo接口和UserInfo实现类。
但有一天从外部借调了一批员工过来,他们的用户信息结构OuterUserInfo和我们并不一样。
现在需要列一张全部员工名单,这就需要用到适配器模式了。

代码
/**
 * 我司员工信息接口
 */
public interface IUserInfo {

    /**
     * 获取姓名
     * @return
     */
    public String getUserName();

    /**
     * 获取手机号码
     * @return
     */
    public String getMobilePhoneNumber();

    /**
     * 获取家庭住址
     * @return
     */
    public String getAddress();

    /**
     * 获取职位
     * @return
     */
    public String getPosition();
}

/**
 * 我司员工信息实现类
 */
public class UserInfo implements IUserInfo{

    @Override
    public String getUserName() {
        return "李四";
    }

    @Override
    public String getMobilePhoneNumber() {
        return "手机号码:188xxxxxxxx";
    }

    @Override
    public String getAddress() {
        return "家庭住址:xx市xx区xxxxx";
    }

    @Override
    public String getPosition() {
        return "职位:CEO";
    }
}

/**
 * 外部员工接口
 */
public class OuterUser {

    public Map<String, String> getBaseInfo() {
        HashMap<String, String> baseInfo = new HashMap<>();
        baseInfo.put("name", "张三");
        baseInfo.put("phone", "188xxxxxxxx");
        baseInfo.put("address", "xx市xx区");
        return baseInfo;
    }

    public Map<String, String> getOfficeInfo() {
        HashMap<String, String> officeInfo = new HashMap<>();
        officeInfo.put("position", "CEO");
        return officeInfo;
    }
}

/**
 * 适配器类
 */
public class OuterUserInfo implements IUserInfo {

    private OuterUser outerUser;

    public OuterUserInfo(OuterUser outerUser) {
        this.outerUser = outerUser;
    }

    @Override
    public String getUserName() {
        return outerUser.getBaseInfo().get("name");
    }

    @Override
    public String getMobilePhoneNumber() {
        return outerUser.getBaseInfo().get("phone");
    }

    @Override
    public String getAddress() {
        return outerUser.getBaseInfo().get("address");
    }

    @Override
    public String getPosition() {
        return outerUser.getBaseInfo().get("position");
    }
}

/**
 * 测试类
 */
public class Test {

    public static void main(String[] args) {

        ArrayList<IUserInfo> userList = new ArrayList<>();
        OuterUserInfo outerUserInfo = new OuterUserInfo(new OuterUser());
        UserInfo userInfo = new UserInfo();
        userList.add(outerUserInfo);
        userList.add(userInfo);


        for (IUserInfo iUserInfo : userList) {
            System.out.println(iUserInfo.getUserName());
        }


    }
}

结果:
    张三
    李四

结语

适配器模式其实很简单,但能够顺利实施依赖于整个项目一直很好地遵循着“依赖倒置原则”和“里氏替换原则”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值