适配器模式

本文深入探讨了适配器模式的原理与应用,包括类适配器与对象适配器的特点,通过实例演示如何在不修改原有类的基础上,通过适配器模式满足新的功能需求,提高代码复用性。

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

定义

在计算机编程中,适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。(来源百度百科)。
简单来说,就是一个原有的类功能满足现有的需求,在不修改原有的类的基础上,使用扩展类的方式满足现有需求,扩展类通过适配原有类从而满足现有的需求。
是一种结构型的设计模式。

分类

  1. 类适配器
  2. 对象适配器

类适配器

优点

  1. 提高类的复用
  2. 在不修改原有类的基础上满足功能

缺点

  1. 过多的使用适配器类,会让系统非常零乱,不易整体进行把握
  2. 由于Java单继承的限制,一个适配器类只能适配一个类

coding

我有一个以前的有线耳机,我新买了一个手机,但是新手机的耳机插口却是type-c的,所以我需要一个转换器来然我能够用以前的耳机听歌。
目标类:

public class TypeC {
    public String outPut() {
        return "接收到电脑的输入,由Type_c接口负责输出";
    }
}

用户期待的功能类:

public interface HeadSet {

    /**
     * 输出音乐
     *
     * @return
     */
    String outPutMusic();
}

适配器类:

public class TypeCAdapter extends TypeC implements HeadSet {
    @Override
    public String outPutMusic() {
        System.out.println(outPut());
        System.out.println("接收到type_c的输出,适配器开始适配");
        return "适配完成,开始播放音乐";
    }
}

测试类:

public class Phone {
    public static void main(String[] args) {
        TypeCAdapter typeCAdapter = new TypeCAdapter();
        System.out.println(typeCAdapter.outPutMusic());
    }
}

输出:
在这里插入图片描述

类图

在这里插入图片描述

对象适配器

用户所期待的功能,定义成一个接口,用户只负责调用这个接口,而这个接口具体是如何实现的,用户并不知道,也就屏蔽了底层实现细节,这有这个接口是实现类才知道具体的实现细节。

优点

  1. 提高类的复用
  2. 在不修改原有类的基础上满足功能
  3. 满足多用组合,少用继承的要求

缺点

  1. 过多的使用适配器类,会让系统非常零乱,不易整体进行把握

源码参照

Java io流、mybatis日志模块的设计

coding

用户所期待的功能:

public interface Logger {

    boolean isDebugEnabled();

    void debug(String msg);

    void debug(String msg, Object... args);

}

适配器类:
适配slf4j的日志实现

public class Slf4jImpl implements Logger {

   //保存slf4j的实现,具体的日志实现功能由它负责
    private org.slf4j.Logger slf4jLogger;

    public Slf4jImpl(String clazz) {
        this.slf4jLogger = LoggerFactory.getLogger(clazz);
    }

    @Override
    public boolean isDebugEnabled() {
        return slf4jLogger.isDebugEnabled();
    }

    @Override
    public void debug(String msg) {
        slf4jLogger.debug(msg);
    }

    @Override
    public void debug(String msg, Object... args) {
        slf4jLogger.debug(msg, args);
    }
}

总结

当原有类的功能不能完全满足现有需求的时候,我们应该考虑适配器模式,这样即可以使用原有类的部分功能,又能满足现有需求,避免重复的coding,也能使代码结构清晰。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值