基于SpringBoot设计模式之结构型设计模式·适配器模式

介绍

  在程序世界中,经常会存在现有的程序无法直接使用,需要做适当的变换之后才能使用的情况。这种用于填补“现有的程序”“所需的程序”之间差异的设计模式就是Adapter模式
Adapter模式也被称为 Wrapper模式。Wrapper有“包装器”的意思,就像用精美的包装纸将普通商品包装成礼物那样,替我们把某样东西包起来,使其能够用于其他用途的东西就被称为“包装器”或是“适配器”

  Adapter模式有以下两种。

  • 对象适配器模式(使用委托的适配器)
  • 类适配器模式(使用继承的适配器)

开始

使用委托的适配器(媒体播放器)

架构图

使用委托的适配器(媒体播放器)

定义被适配者

public interface AdvancedMediaPlayer {

    /**
     * 播放视频
     *
     * @param fileName
     */
    void specificPlay(String fileName);


}

@Service
public class MP4Player implements AdvancedMediaPlayer {
    @Override
    public void specificPlay(String fileName) {
        System.out.println("播放 mp4 格式的媒体 , 文件名 : " + fileName);
    }
}

@Service
public class WmvPlayer implements AdvancedMediaPlayer {

    @Override
    public void specificPlay(String fileName) {
        System.out.println("播放 wmv 格式的媒体 , 文件名 : " + fileName);
    }

}

定义需求接口

public interface MediaPlayer {
    /**
     * 播放媒体,这里由于有很多的媒体类型,通过type解决 类型不同。
     * 因此,这里衍生可以加上工厂解决这个type问题
     *
     * @param audioType
     * @param fileName
     */
    void play(String audioType, String fileName);
}

定义适配者

@Service
public class MediaAdapter implements MediaPlayer {

    @Resource
    private Map<String, AdvancedMediaPlayer> advancedMediaPlayerMap;

    @Override
    public void play(String audioType, String fileName) {
        AdvancedMediaPlayer advancedMediaPlayer = advancedMediaPlayerMap.get(audioType);
        if (Objects.isNull(advancedMediaPlayer)) {
            System.out.println("当前类型暂不支持,无法播放~~~~~");
        } else {
            advancedMediaPlayer.specificPlay(fileName);
        }
    }


}

使用继承的适配器(手机充电接口)

架构图

使用继承的适配器(手机充电接口)

定义被适配者

public interface RechargerAdaptee {
    void specificRecharger();
}
@Service
public class LightningAdaptee implements RechargerAdaptee {
    @Override
    public void specificRecharger() {
        System.out.println("完成 lightning 接口的充电");
    }
}

@Service
public class TypeCAdaptee implements RechargerAdaptee {
    @Override
    public void specificRecharger() {
        System.out.println("完成 type C 接口的充电");
    }
}

定义需求接口

public interface LightningConnector {
    void lightningRecharger();
}
public interface TypeCConnector {
    void typeCRecharger();
}

定义适配者

@Service
public class LightningAdapter extends TypeCAdaptee implements LightningConnector {

    @Override
    public void lightningRecharger() {
        System.out.println("---------------lightning 转 type C 接口~适配器开始工作-------------------");
        super.specificRecharger();
    }

}
@Service
public class TypeCAdapter extends LightningAdaptee implements TypeCConnector {

    @Override
    public void typeCRecharger() {
        System.out.println("---------------type C 转 lightning 接口~适配器开始工作-------------------");
        super.specificRecharger();
    }

}

测试样例

@Slf4j
@SpringBootTest(classes = AdapterApplication.class)
public class TestAdapter {

    @Resource
    private LightningAdapter lightningAdapter;

    @Resource
    private TypeCAdapter typeCAdapter;

    @Resource
    private MediaAdapter mediaAdapter;

    @Test
    public void testRechargerAdapter() {
        lightningAdapter.lightningRecharger();
        System.out.println("----------------------------------");
        typeCAdapter.typeCRecharger();
    }

    @Test
    public void testMediaAdapter() {
        mediaAdapter.play("MP4Player","1.MP4");
        mediaAdapter.play("wmvPlayer","2.wmv");
        mediaAdapter.play("swfPlayer","3.swf");
    }

}

总结

  将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

优点

  1. 促进了类之间的协同工作,即使它们没有直接的关联。
  2. 提高了类的复用性。
  3. 增加了类的透明度。
  4. 提供了良好的灵活性。

缺点

  1. 过度使用适配器可能导致系统结构混乱,难以理解和维护。
  2. 在Java中,由于只能继承一个类,因此只能适配一个类,且目标类必须是抽象的。
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值