前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式系列| 适配器模式

设计模式系列| 适配器模式

作者头像
狼王编程
发布2021-06-01 16:12:40
2800
发布2021-06-01 16:12:40
举报
文章被收录于专栏:狼王编程之路狼王编程之路

大家好,我是狼王,一个爱打球的程序员

这是设计模式的第七篇,这篇让我们来认识一下适配器模式


1、概述

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

2、适用场景

1)当你希望使用某个类, 但是其接口与其他代码不兼容时, 可以使用适配器类。

2)如果您需要使用这样一些类, 他们处于同一个继承体系, 并且他们又有了额外的一些共同的方法, 但是这些共同的方法不是所有在这一继承体系中的子类所具有的共性。可以将这些方法封装在一个装饰器中。

3、实例

有以下场景:

代码语言:javascript
复制
方钉适配圆孔的适配器,方钉想放到圆孔中,则圆孔的直径等于方钉的对角长度。

定义方钉、圆孔

圆孔:
直径

圆钉:
直径

方钉:
边长

定义方钉:

代码语言:javascript
复制
public class SquareNails {

    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    public SquareNails(double width) {
        this.width = width;
    }

    /**
     * 边长
     */
    private double width;

}

定义圆钉:

代码语言:javascript
复制
public class RoundNails {

    /**
     * 直径
     */
    private double diameter;

    public double getDiameter() {
        return diameter;
    }

    public void setDiameter(double diameter) {
        this.diameter = diameter;
    }

    public RoundNails(double diameter) {
        this.diameter = diameter;
    }
}

定义圆孔:

代码语言:javascript
复制
public class RoundHold {

    /**
     * 直径
     */
    private double diameter;

    public RoundHold(double diameter) {
        this.diameter = diameter;
    }

    public double getDiameter() {
        return diameter;
    }

    public void setDiameter(double diameter) {
        this.diameter = diameter;
    }

    /**
     * 校验是否合适
     * @param roundNails
     * @return
     */
    public boolean fits(RoundNails roundNails){
        if (diameter >= roundNails.getDiameter()){
            return true;
        }else {
            return false;
        }

    }
}

定义适配器:

代码语言:javascript
复制
public class SquareNailsRoundHoldAdapter {

    public RoundNails getResult(SquareNails squareNails){
        double width = squareNails.getWidth();
        double diagonal = width * Math.sqrt(2);
        RoundNails roundNails = new RoundNails(diagonal);
        return roundNails;
    }
}

测试类:

代码语言:javascript
复制
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestApplication.class)
public class TestDemo {

    @Test
    public void test() {
        //定义个圆孔
        RoundHold roundHold = new RoundHold(10);
        //定义圆钉
        RoundNails roundNails = new RoundNails(10);
        //定义方钉,边距10
        SquareNails squareNails10 = new SquareNails(10);
        //定义方钉,边距6
        SquareNails squareNails6 = new SquareNails(6);
        //适配器
        SquareNailsRoundHoldAdapter squareNailsRoundHoldAdapter = new SquareNailsRoundHoldAdapter();
        RoundNails result10 = squareNailsRoundHoldAdapter.getResult(squareNails10);
        RoundNails result6 = squareNailsRoundHoldAdapter.getResult(squareNails6);
        //圆钉是否合适
        if (roundHold.fits(roundNails)) {
            System.out.println("this round nails is fits");
        } else {
            System.out.println("this round nails is does not fits");
        }
        //10方钉是否合适
        if (roundHold.fits(result10)) {
            System.out.println("squareNails10 is fits");
        } else {
            System.out.println("squareNails10 is does not fits");
        }
        //6方钉是否合适
        if (roundHold.fits(result6)) {
            System.out.println("squareNails6 is fits");
        } else {
            System.out.println("squareNails6 is does not fits");
        }
    }
}

结果:

代码语言:javascript
复制
this round nails is fits
squareNails10 is does not fits
squareNails6 is fits

4、总结

优点:

1)单一原则:将代码或者数据转换的过程从主要业务逻辑区分出来。

2)开闭原则:只要客户端代码通过客户端接口与适配器进行交互, 你就能在不修改现有客户端代码的情况下在程序中添加新类型的适配器。

缺点:

增加代码复杂度。使用时需要考虑是否在原功能上修改更加简单。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 狼王编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、概述
  • 2、适用场景
  • 3、实例
    • 有以下场景:
      • 定义方钉:
        • 定义圆钉:
          • 定义圆孔:
            • 定义适配器:
              • 测试类:
                • 结果:
                • 4、总结
                  • 优点:
                    • 缺点:
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档