Java学习笔记之设计模式(4)适配器模式

本文通过iPhone6充电器适配器的例子,详细介绍了适配器模式的概念、应用场景及其实现方式。适配器模式用于解决已有类接口与需求接口不匹配的问题,通过创建一个适配器来桥接两者。

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

什么是适配器模式

顾名思义,适配器模式(Adapter Pattern)当然是用来适配的啦。当你想使用一个已有的类,但是这个类的接口跟你的又不一样,不能拿来直接用,这个时候你就需要一个适配器来帮你了。

这就好像你兴冲冲地跑去香港,买了个港版的 iPhone6,充电器插头拿回家一看,不能用啊。这时候你多么需要买一个转接头适配器...

图片描述信息

你去香港旅游,买的 iPhone6 的充电器插头是英标的,它是那种三脚是方形的插头。

图片描述信息

而咱们国标的插头是两只脚,即使是三只脚的插头也和英标不一样。

图片描述信息

为了方便,这里我们就假设国标插头就只是两只脚的插头吧。(其实我是懒。。)

图片描述信息

好的,目标明确,英标三只脚插头充电,国标两只脚插头充电。你家很富,有很多插座可以充电。

此处输入图片的描述

适配器模式示例代码

在国内的家中只能用国标接口进行充电。


// 国标插头
public interface CnPluginInterface {
    void chargeWith2Pins();
}

// 实现国标插座的充电方法
public class CnPlugin implements CnPluginInterface {
    public void chargeWith2Pins() {
        System.out.println("charge with CnPlugin");
    }
}

// 在国内家中充电
public class Home {
    private CnPluginInterface cnPlugin;

    public Home() { }

    public Home(CnPluginInterface cnPlugin) {
        this.cnPlugin = cnPlugin;
    }

    public void setPlugin(CnPluginInterface cnPlugin) {
        this.cnPlugin = cnPlugin;
    }

    // 充电
    public void charge() {
        // 国标充电
        cnPlugin.chargeWith2Pins();
    }
}

// 国标测试类
public class CnTest {
    public static void main(String[] args) {
        CnPluginInterface cnPlugin = new CnPlugin();
        Home home = new Home(cnPlugin);
        // 会输出 “charge with CnPlugin”
        home.charge();
    }
}

然而,当把 iPhone6 带回来时,因为与家里的插座不匹配,所以需要一个适配器。这个适配器必须满足以下条件:

  1. 插头必须符合国内标准的接口,否则的话还是没办法插到国内插座中;
  2. 在调用上面实现的国标接口进行充电时,提供一种机制,将这个调用转到对英标接口的调用 。

这就要求:

  1. 适配器必须实现原有的旧的接口
  2. 适配器对象中持有对新接口的引用,当调用旧接口时,将这个调用委托给实现新接口的对象来处理,也就是在适配器对象中组合一个新接口。
// 英标插头
public interface EnPluginInterface {
    void chargeWith3Pins();
}

// 实现英标插座的充电方法
public class EnPlugin implements EnPluginInterface {
    public void chargeWith3Pins() {
        System.out.println("charge with EnPlugin");
    }
}

//适配器
public class PluginAdapter implements CnPluginInterface {
     private EnPluginInterface enPlugin;

     public PluginAdapter(EnPluginInterface enPlugin) {
         this.enPlugin = enPlugin;
 }

 // 这是重点,适配器实现了国标的插头,然后重写国标的充电方法,在国标的充电方法中调用英标的充电方法
 @Override
public void chargeWith2Pins() {
    enPlugin.chargeWith3Pins();
     }
}

// 适配器测试类
public class AdapterTest {
    public static void main(String[] args) {
        EnPluginInterface enPlugin = new EnPlugin();
        Home home = new Home();
        PluginAdapter pluginAdapter = new PluginAdapter(enPlugin);
        home.setPlugin(pluginAdapter);
        // 会输出 “charge with EnPlugin”
        home.charge();
    }
}

这样就实现了对 iphone6 进行充电。

适配器模式的应用

前面已经说了,当你想使用一个已有的类,但是这个类的接口跟你的又不一样,不能拿来直接用,这个时候你就需要一个适配器来帮你了,其主要作用就是在旧的接口、新的接口之间完成适配。

比如说,做过 Android 的同学肯定写 ListView 的适配器都写吐了吧...

适配器模式的三个特点:

  • 适配器对象实现原有接口
  • 适配器对象组合一个实现新接口的对象(这个对象也可以不实现一个接口,只是一个单纯的对象)
  • 对适配器原有接口方法的调用被委托给新接口的实例的特定方法

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值