• 基于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中,由于只能继承一个类,因此只能适配一个类,且目标类必须是抽象的。
  • 相关阅读:
    WEB自动化_css应用
    使用depp在小程序中子组件修改第三方ui库uview,样式不生效问题
    人工智能的未来
    python之shutil模块
    【微信小程序】小程序支持的css选择器、小程序自适应单位rpx简介
    什么是软件EV代码签名证书
    springfox及springdoc
    aws亚马逊云免费账号代充值!!!什么是 AWS Lambda?
    【Linux】 OpenSSH_9.3p1 升级到 OpenSSH_9.3p2(亲测无问题,建议收藏)
    k8s配置deployment解读
  • 原文地址:https://blog.csdn.net/Eva_xiaoxi/article/details/139250677