适配器模式

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 适配器模式

适配器模式是一种结构型设计模式。适配器模式的思想是:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。


用电器来打个比喻:有一个电器的插头是三脚的,而现有的插座是两孔的,要使插头插上插座,我们需要一个插头转换器,这个转换器即是适配器。

适配器模式涉及3个角色:


  • 源(Adaptee):需要被适配的对象或类型,相当于插头。
  • 适配器(Adapter):连接目标和源的中间对象,相当于插头转换器。
  • 目标(Target):期待得到的目标,相当于插座。
    适配器模式包括3种形式:类适配器模式、对象适配器模式、接口适配器模式(或又称作缺省适配器模式)。


类适配器模式


从下面的结构图可以看出,Adaptee类并没有method2()方法,而客户端则期待这个方法。为使客户端能够使用Adaptee类,我们把Adaptee与Target衔接起来。Adapter与Adaptee是继承关系,这决定了这是一个类适配器模式。

image.png
类图.png


代码实现:

//源:
public class Adaptee {
    public void method1() {
        System.out.println("老的方法实现");
    }
}
//目标:
public interface Target {
    void method1();
    void method2();
}
//适配器:
public class Adapter extends Adaptee implements Target {
    private Adaptee adaptee;
    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }
    @Override
    public void method2() {
        System.out.println("method2" + "新的方法");
    }
}


运行结果:


image.png

运行结果图.png


对象适配器模式


从下面的结构图可以看出,Adaptee类并没有method2()方法,而客户端则期待这个方法。与类适配器模式一样,为使客户端能够使用Adaptee类,我们把Adaptee与Target衔接起来。但这里我们不继承Adaptee,而是把Adaptee封装进Adapter里。这里Adaptee与Adapter是组合关系。


image.png

image.png


代码实现:


Target和Adaptee和上面的类适配器一样,不再贴出。


适配器:

public class Adapter1 implements Target {
    private Adaptee adaptee;
    public Adapter1(Adaptee adaptee) {
        this.adaptee = adaptee;
    }
    @Override
    public void method1() {
        adaptee.method1();
    }
    @Override
    public void method2() {
        System.out.println("method2" + "新的方法");
    }
}


类适配器与对象适配器的区别



类适配器使用的是继承的方式,直接继承了Adaptee,所以无法对Adaptee的子类进行适配。

对象适配器使用的是组合的方式,·所以Adaptee及其子孙类都可以被适配。另外,对象适配器对于增加一些新行为非常方便,而且新增加的行为同时适用于所有的源。


基于组合/聚合优于继承的原则,使用对象适配器是更好的选择。但具体问题应该具体分析,某些情况可能使用类适配器会适合,最适合的才是最好的。


这个模式一般是在系统不断升级的过程中使用,对已经写好的老的类,写一套适配器来适配老类,但是提供新的接口,这个我们在后面系统升级的时候,可以去实践。在项目阶段二的时候,会去实践的,真的有版本升级的时候,才可以完美的去演示这个模式的使用效果。


还有一种情况,是对于已有的第三方类库,比如redis的客户端,或者是elasticsearch的客户端,他们提供了一套API,但是我们这里的要求是需要面向我们这里的DAO接口来进行编程,此时可以写一个适配器,将比如redis客户端的接口适配到我们的接口

比如我们的DAO接口,要求的接口风格都是:save、update、remove、list、get,这些方法风格DAORedisImpl,redis客户端,get、set、mset、mget,一套接口;适配器,DAORedisImpl就是一个适配器,这个适配器实现的是我们的DAO接口,在我们的save、update、remove等方法中,去调用redis客户端的get、set、mset、mget等方法。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
Windows
|
6月前
|
设计模式 C++
结构型 适配器模式
结构型 适配器模式
39 0
|
6月前
|
设计模式
【适配器模式】—— 每天一点小知识
【适配器模式】—— 每天一点小知识
|
Java API
适配器模式的运用
适配器模式的运用
82 0
|
设计模式 数据库 C++
2023-6-15-第六式适配器模式
2023-6-15-第六式适配器模式
92 0
|
设计模式 前端开发
关于适配器模式我所知道的
关于适配器模式我所知道的
47 0
|
Java 程序员 API
结构型模式-适配器模式
结构型模式-适配器模式
88 0
|
设计模式
我学会了,适配器模式
适配器模式属于结构型模式,这个类型的设计模式总结出了 类、对象组合后的经典结构,将类、对象的结构和使用解耦了,花式的去借用对象。
98 0
我学会了,适配器模式
|
设计模式 Java Spring
适配器模式详解与应用
引用一个最经典的例子,我们自己家里的电压都是220V的,而早期的手机充电时所用的都是5V的电压。要想让手机在220V的家庭电压下充电,就需要一个电源适配器。在编程中,也经常会出现一个类程序无法直接去使用,而需要通过适当变换的行为抽象出来的设计模式就是适配器模式。
|
设计模式 Java
【Java设计模式系列】适配器模式及适用场景详解(中)
【Java设计模式系列】适配器模式及适用场景详解
111 0
【Java设计模式系列】适配器模式及适用场景详解(中)