设计模式-适配器模式

# 适配器模式

1.简介

适配器模式是一种结构性设计模式,它能使接口不兼容的对象进行相互合作。

定义:

适配器是一个特殊的对象,它能够转换对象接口,使其可以与其他对象进行交互。

适配器通过封装对象,将复杂的转换过程隐藏于幕后,被封装的对象甚至察觉不到适配器的存在。

不仅可以转换不同格式的数据,更有助于不同对象之间的合作。

运作方式:

1.适配器实现与其中一个现有对象兼容的接口

2.现有对象可以使用该接口安全的调用适配器方法。

3.适配器方法被调用后将以另一个对象兼容的格式和顺序将请求传递给该对象。

2.UML图

适配器模式UML.png

3.代码实现

eg:如一个手机充电器需要5V的充电器进行充电,但是家用电为220v不符合手机的充电标准,所以需要一个适配来进行转换,将220v转换为5v进行使用。

首先构建一个手机类:

package com.gs.designmodel.adaptermodel;







import lombok.extern.slf4j.Slf4j;





/**


 * @author: Gaos


 * @Date: 2023-01-11 16:29
 * 首先使用一部手机
 **/

@Slf4j

public class Mobile {


    /**


     * 充电
     * @param power 需要一个5v的充电器
     */
    public void inputPower(V5Power power) {
        int provideV5Power = power.provideV5Power();
        log.info("手机(客户端):我需要一个5v电压充电,现在是——————》{}", provideV5Power);
    }
}

手机充电需要一个提供5v电压的接口:

package com.gs.designmodel.adaptermodel;







/**
 * @author: Gaos
 * @Date: 2023-01-11 16:33
 **/
public interface V5Power {
    /**
     * 提供5v电压的充电器接口
     * @return
     */
    int provideV5Power();
}

但我们拥有的其实是一个220v的家用电:

package com.gs.designmodel.adaptermodel;







import lombok.extern.slf4j.Slf4j;





/**


 * @author: Gaos


 * @Date: 2023-01-11 16:37
 *
 * 现在拥有的其实是220v的家用电
 **/
@Slf4j
public class V220Power {
    /**


     *
     */

    public int provide220Power() {
      log.info("我提供220v家用电");
      return 220;
    }
}

这时我们就需要一个适配器来起到220v转到5v的作用:

package com.gs.designmodel.adaptermodel;







import lombok.extern.slf4j.Slf4j;





/**


 * @author: Gaos


 * @Date: 2023-01-11 16:42
 * 需要一个适配器完成 220v->5v的作用
 **/

@Slf4j

public class V5PowerAdapter implements V5Power{


    /**


     * 使用组合的方式
     */

    private V220Power v220Power;

    /**
     * 提供构造方法
     * @param v220Power
     */
    public V5PowerAdapter(V220Power v220Power) {
        this.v220Power = v220Power;
    }

    @Override
    public int provideV5Power() {
        int i = v220Power.provide220Power();
        // 经过一系列的转换操作
        log.info("适配器:经过一系列的转换操作 我将{}V电压转换为了 5V", i);
        return 5;
    }
}

最后,我们进行测试,也就是给手机充电:

public static void main(String[] args) {
        // 测试
        Mobile mobile = new Mobile();
        V5PowerAdapter v5PowerAdapter = new V5PowerAdapter(new V220Power());
        mobile.inputPower(v5PowerAdapter);
    }

输出:

16:47:25.747 [main] INFO com.gs.designmodel.adaptermodel.V220Power - 我提供220v家用电
16:47:25.748 [main] INFO com.gs.designmodel.adaptermodel.V5PowerAdapter - 适配器:经过一系列的转换操作 我将220V电压转换为了 5V
16:47:25.749 [main] INFO com.gs.designmodel.adaptermodel.Mobile - 手机(客户端):我需要一个5v电压充电,现在是——————》5

4.总结

从上面的例子我们可以看出,我们使用了一个手机适配器将220v转换为了5v供手机使用,并且原有的手机及电压类都不需要进行修改。

但其实这种模式会增加代码的复杂性,降低代码的可读性。比如我们看到它调用了A接口,但它其实在内部被适配为了B接口的实现,这其实并不是好的现象。

适配器不仅是单向的也可以被扩展为双向的适配器,既可以把目标接口转为适配器接口,也可以把适配器接口转换为目标接口。

通常适用于当你希望使用某个类,但是其接口与其他代码并不兼容时,或者来自第三方,本身无法修改的时候,可以使用适配器类。

或者你需要复用这样的一些类,他们处于同一个继承体系,并且他们又有了一些额外的共同的方法,但这些共同方法并不属于同一继承体系下的方法。

相关参考文章:

refactoringguru.cn/design-patt…

blog.csdn.net/lmj62356579…

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYTu8rmB' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片