您的位置:首页 > 娱乐 > 明星 > 基于SpringBoot设计模式之结构型设计模式·适配器模式

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

2024/12/23 10:24:04 来源:https://blog.csdn.net/Eva_xiaoxi/article/details/139250677  浏览:    关键词:基于SpringBoot设计模式之结构型设计模式·适配器模式

文章目录

  • 介绍
  • 开始
    • 使用委托的适配器(媒体播放器)
      • 架构图
      • 定义被适配者
      • 定义需求接口
      • 定义适配者
    • 使用继承的适配器(手机充电接口)
      • 架构图
      • 定义被适配者
      • 定义需求接口
      • 定义适配者
    • 测试样例
  • 总结
    • 优点
    • 缺点

介绍

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

  Adapter模式有以下两种。

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

开始

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

架构图

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

定义被适配者

public interface AdvancedMediaPlayer {/*** 播放视频** @param fileName*/void specificPlay(String fileName);}
@Service
public class MP4Player implements AdvancedMediaPlayer {@Overridepublic void specificPlay(String fileName) {System.out.println("播放 mp4 格式的媒体 , 文件名 : " + fileName);}
}
@Service
public class WmvPlayer implements AdvancedMediaPlayer {@Overridepublic 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 {@Resourceprivate Map<String, AdvancedMediaPlayer> advancedMediaPlayerMap;@Overridepublic 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 {@Overridepublic void specificRecharger() {System.out.println("完成 lightning 接口的充电");}
}
@Service
public class TypeCAdaptee implements RechargerAdaptee {@Overridepublic 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 {@Overridepublic void lightningRecharger() {System.out.println("---------------lightning 转 type C 接口~适配器开始工作-------------------");super.specificRecharger();}}
@Service
public class TypeCAdapter extends LightningAdaptee implements TypeCConnector {@Overridepublic void typeCRecharger() {System.out.println("---------------type C 转 lightning 接口~适配器开始工作-------------------");super.specificRecharger();}}

测试样例

@Slf4j
@SpringBootTest(classes = AdapterApplication.class)
public class TestAdapter {@Resourceprivate LightningAdapter lightningAdapter;@Resourceprivate TypeCAdapter typeCAdapter;@Resourceprivate MediaAdapter mediaAdapter;@Testpublic void testRechargerAdapter() {lightningAdapter.lightningRecharger();System.out.println("----------------------------------");typeCAdapter.typeCRecharger();}@Testpublic 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中,由于只能继承一个类,因此只能适配一个类,且目标类必须是抽象的。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com