设计模式学习——适配器模式

本文详细介绍了适配器模式的概念,包括其定义、使用场景、类适配器与对象适配器的区别,并通过实例展示了如何在Java中实现这两种适配器。此外,还探讨了适配器模式在Android源码中的应用,以及该模式的优缺点。

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

  1. 定义

适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配无法在一起工作的两个类可以在一起工作
(得到一个能够兼容原有接口和目标接口的适配类)

  1. 使用场景

(1)系统需要使用现有的类,但此类的接口不符合系统的需要,即接口不兼容
(2)想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
(3)需要一个统一的输出接口,而输入端的类型不可预知

  1. UML类图

适配器模式分为两种,即类适配器模式与对象适配器模式。

以下是类适配器的UML图。
在这里插入图片描述

  • Target:目标角色,也就是所期待得到的接口。注意:由于这里讨论的是类适配器模式,因此目标不可以是类。
  • Adaptee:现在需要适配的接口。
  • Adapter:适配器角色,也就是本模式的核心。适配器把源接口转换成目标接口。显然,这一角色不可以是接口,而必须是具体类。

以下是对像适配器的UML图:
在这里插入图片描述

两种的差别在于,适配器的适配角色Adapter对要适配角色Adaptee的兼容方式,类适配器是通过继承Adaptee实现,对象适配器通过组合方式实现。

  1. 简单实现
    以笔记本电源适配器为例,电源适配器将220V的电压转换到5V。那么5V电压就是Target接口,220V电压就是Adaptee类,转换就是Adapter。
    (1)以类适配器模式实现
//Target角色
public interface FiveVolt { 
    public int getVolt5();
}

//Adaptee角色
public class Volt220 {
    public int getVolt220(){
        return 220;
    }
}

public class VoltAdapter extends Volt220 implements FiveVolt{
  @Overridepublic int getVolt5() {
        return 5;
    }
}

public class Test {
    public static void main(String[] args) {
        VoltAdapter adapter = new VoltAdapter();
        System.out.println("输出电压:" + adapter.getVolt5());
    }
}

结果:
输出电压:5
现在这个类Adapter既可以使用220V的也可以使用5V的,实现了两个接口的兼容。

(2)对象适配器模式实现

对象适配器模式与类适配器模式不同的是,对象适配器模式不是使用继承关系连接到Adapter类,而是使用代理关系连接到Adapter类。所以FiveVolt 、Volt220 不变,VoltAdapter 修改如下:


public class VoltAdapter1 implements FiveVolt{

    Volt220 mVolt220;

    public VoltAdapter1(Volt220 adaptee) {
        this.mVolt220 = adaptee;
    }

    public int getVolt220(){
        return mVolt220.getVolt220();
    }

    @Overridepublic int getVolt5() {
        return 5;
    }
}

Test修改


public class Test {

    public static void main(String[] args) {
        VoltAdapter adapter = new VoltAdapter(new Volt220());
        System.out.println("输出电压:" + adapter.getVolt5());
    }
}

这种实现方式直接将要适配的对象传递到Adapter中,使用组合的形式实现接口兼容的效果。这比类适配器方式更为灵活,同时被适配对象的方法不会暴露出来。因此对象适配器模式更加灵活、实用。

5.Android源码中的适配器模式

1.ListView的Adapter

这里ListView的Adapter就是使用的对象适配器模式,Target就是View,Adapter角色就是将Item View输出为View抽象的角色,Adaptee就是需要被处理的Item View。

6.总结

1.优点

(1)更好的复用性:系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。

(2)更好的扩展性:在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。

2.缺点

过多的使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vinson武

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值