java设计模式(七)适配器模式(Adapter Pattern)
1、模式介绍:
适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户希望的另外一个接口。适配器模式通常用于需要复用现有的类,但是接口与客户端的要求不完全匹配的情况。它包括两种形式:类适配器模式和对象适配器模式。
2、应用场景:
系统需要使用现有的类,而这些类的接口不符合需求。
不想修改现有的接口,而又需要复用该接口的情况。
多个类似功能的接口需要统一。
3、优点:
增加了类的透明性和复用性:将具体的实现封装在适配器中,对客户端来说是透明的,同时提高了被适配类的复用性。
灵活性好:通过适配器,可以在不改变原有代码的基础上增加新的适配器类,符合开闭原则。
4、缺点:
过多使用适配器,会让系统非常零乱。
增加系统的复杂性:因为增加了额外的适配器,可能会增加系统的理解难度
5、代码实现:
/** * 适配接口 * * @author FM_南风 * @date 2024/6/27 13:53 */ public interface MediaPlayer { void play(String mediaType, String fileName); } /** * 被适配者 * * @author FM_南风 * @date 2024/6/27 13:54 */ public class AudioPlayer implements MediaPlayer{ @Override public void play(String mediaType, String fileName) { if (mediaType.equalsIgnoreCase("mp3")) { System.out.println("播放MP3文件: " + fileName); } else { System.out.println("使用" + mediaType + "媒体播放"); } } } /** * 新适配接口 * * @author FM_南风 * @date 2024/6/27 13:55 */ public interface AdvancedMediaPlayer { void playVlc(String fileName); void playMp4(String fileName); } /** * Mp4播放器实现新的接口 * * @author FM_南风 * @date 2024/6/27 13:56 */ public class Mp4Player implements AdvancedMediaPlayer{ @Override public void playVlc(String fileName) { } @Override public void playMp4(String fileName) { System.out.println("播放MP4文件: " + fileName); } } /** * Vlc播放器实现新的接口 * * @author FM_南风 * @date 2024/6/27 13:56 */ public class VlcPlayer implements AdvancedMediaPlayer { @Override public void playVlc(String fileName) { System.out.println("播放Vlc文件: " + fileName); } @Override public void playMp4(String fileName) { } } /** * 适配器类,实现目标接口并持有被适配者的引用 * * @author FM_南风 * @date 2024/6/27 13:57 */ public class MediaAdapter implements MediaPlayer{ AdvancedMediaPlayer advancedMusicPlayer; public MediaAdapter(String mediaType) { if (mediaType.equalsIgnoreCase("vlc")) { advancedMusicPlayer = new VlcPlayer(); } else if (mediaType.equalsIgnoreCase("mp4")) { advancedMusicPlayer = new Mp4Player(); } } @Override public void play(String mediaType, String fileName) { if (mediaType.equalsIgnoreCase("vlc")) { advancedMusicPlayer.playVlc(fileName); } else if (mediaType.equalsIgnoreCase("mp4")) { advancedMusicPlayer.playMp4(fileName); } } } /** * 应用 * * @author FM_南风 * @date 2024/6/27 13:58 */ public class AdapterClient { public static void main(String[] args) { MediaPlayer audioPlayer = new AudioPlayer(); audioPlayer.play("mp3", "音乐.mp3"); audioPlayer.play("mp4", "视频.mp4"); audioPlayer.play("vlc", "视频.vlc"); audioPlayer.play("avi", "视频.avi"); // Unsupported media type } }
6、结果展示:
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。