博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java Adapter Pattern(适配器模式)
阅读量:6575 次
发布时间:2019-06-24

本文共 3516 字,大约阅读时间需要 11 分钟。

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。

优点: 1、可以让任何两个没有关联的类一起运行。 2、提高了类的复用。 3、增加了类的透明度。 4、灵活性好。

缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。 2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

  1. 为媒体播放器和更高级的媒体播放器创建接口。
/** * 1. 为媒体播放器创建接口。 * @author mazaiting */public interface MediaPlayer {    /**     * 播放视频     * @param audioType 类型     * @param fileName 文件名     */    void play(String audioType, String fileName);}/** * 1. 为更高级的媒体播放器创建接口。 * @author mazaiting */public interface AdvancedMediaPlayer {    /**     * 播放Vlc视屏格式     */    void playVlc(String fileName);    /**     * 播放Mp4视屏格式     */    void playMp4(String fileName);}
  1. 创建实现了 AdvancedMediaPlayer 接口的实体类。
/** * 2. 创建实现了 AdvancedMediaPlayer 接口的实体类。 * @author mazaiting */public class VlcPlayer implements AdvancedMediaPlayer{    public void playVlc(String fileName) {        System.out.println("Playing vlc file. Name: " + fileName);    }    public void playMp4(String fileName) {}}/** * 2. 创建实现了 AdvancedMediaPlayer 接口的实体类。 * @author mazaiting */public class Mp4Player implements AdvancedMediaPlayer{    public void playVlc(String fileName) {}    public void playMp4(String fileName) {        System.out.println("Playing mp4 file. Name: " + fileName);    }}
  1. 创建实现了 MediaPlayer 接口的适配器类。
/** * 3. 创建实现了 MediaPlayer 接口的适配器类。 * @author mazaiting */public class MediaAdapter implements MediaPlayer{    /**vlc格式*/    public static final String VLC = "vlc";    /**mp4格式*/    public static final String MP4 = "mp4";    AdvancedMediaPlayer advancedMediaPlayer;        public MediaAdapter(String audioType){        if (audioType.equalsIgnoreCase(VLC)){            advancedMediaPlayer = new VlcPlayer();        } else if (audioType.equalsIgnoreCase(MP4)){            advancedMediaPlayer = new Mp4Player();        }    }        public void play(String audioType, String fileName) {        if (audioType.equalsIgnoreCase(VLC)){            advancedMediaPlayer.playVlc(fileName);        } else if (audioType.equalsIgnoreCase(MP4)) {            advancedMediaPlayer.playMp4(fileName);        }    }}
  1. 创建实现了 MediaPlayer 接口的实体类。
/** * 4. 创建实现了 MediaPlayer 接口的实体类。 * @author mazaiting */public class AudioPlayer implements MediaPlayer{    /**mp3格式*/    public static final String MP3 = "mp3";        MediaAdapter mediaAdapter;        public void play(String audioType, String fileName) {        // 播放 MP3 音乐文件的内置支持        if (audioType.equalsIgnoreCase("mp3")) {            System.out.println("Playing mp3 file. Name: " + fileName);        }        // mediaAdapter 提供了其他文件格式的支持        else if (audioType.equalsIgnoreCase(MediaAdapter.VLC) ||                audioType.equalsIgnoreCase(MediaAdapter.MP4)) {            mediaAdapter = new MediaAdapter(audioType);            mediaAdapter.play(audioType, fileName);        }else {            System.out.println("Invalid media. "+                    audioType + " format not supported");        }    }}
  1. 主函数调用
public class Client {    public static void main(String[] args) {        AudioPlayer audioPlayer = new AudioPlayer();        audioPlayer.play("mp3", "beyond the horizon.mp3");        audioPlayer.play("mp4", "alone.mp4");        audioPlayer.play("vlc", "far far away.vlc");        audioPlayer.play("avi", "mind me.avi");    }}
  1. 打印结果
Playing mp3 file. Name: beyond the horizon.mp3Playing mp4 file. Name: alone.mp4Playing vlc file. Name: far far away.vlcInvalid media. avi format not supported

转载地址:http://fzwno.baihongyu.com/

你可能感兴趣的文章
GIS-013-Cesium Terrain 数据生成
查看>>
java int与integer的区别
查看>>
UVALive3902 Network[贪心 DFS&&BFS]
查看>>
图像处理的基本概念
查看>>
039 hive中关于数据库与表等的基本操作
查看>>
Java Volatile关键字 以及long,double在多线程中的应用
查看>>
__slots__用法以及优化
查看>>
分部积分的图形解释
查看>>
idea常用快捷键大全(转)
查看>>
HashMap和Hashtable的区别 源码分析
查看>>
Git初始化仓库
查看>>
mysql利用timestamp来进行帖子排序
查看>>
SQL Server 管理常用的SQL和T-SQL
查看>>
Microsoft Orleans 之 入门指南
查看>>
MySoft.Data 2.7.3版本的GitHub托管(ORM升级封装)
查看>>
eclipse各版本代号
查看>>
mysql 配置 utf8 依然乱码
查看>>
089实战 Nginx的安装
查看>>
Laravel 使用多个数据库的问题。
查看>>
overridePendingTransition简介
查看>>