Java设计模式(一)之 适配器模式

前言:这是我第一篇笔记,没有什么经验,如果哪里有问题希望可以告诉我,我会积极改正。不说废话,下面进入正题。

开始啦

适配器模式

1、首先说一下什么是适配器模式

    适配器就是一个桥梁,去连接两个不兼容的接口。举个例子,电脑和内存卡是两个独立的东西,两者之间是不兼容的,读卡器就是内存卡和笔记本之间的桥梁,使用读卡器就可以通过笔记本来读取内存卡,读卡器就是一个适配器。

2、项目中应用场景

    系统需要使用其他一些现有的类,而这些类的接口不符合系统的要求

3、应用实例

    在LINUX 上运行 WINDOWS 程序,美国电器110V,中国 220V,就要有一个适配器将 110V 转化为 220V等等。

4、优缺点

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

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

5、实现例子

    比如现在有个MP3播放器,它只能播放MP3格式的音频,但是感觉不满足我的需求,我还想用这个播放器播放WAV和WAM格式的音频(有点不按常理),这个时候该怎么办呢?

    准备:

                MP3Player---MP3播放器目前只能播放MP3格式,最终要实现的就是让它播放WAV和WMA格式的音频

                WavPlayer---WAV播放器只能播放WAV格式

                WmaPlayer---WMA播放器只能播放WMA格式

                IMediaPlayer---这三个播放器的父接口,他有一个这三个播放器共有的功能---播放功能

                ISeniorPlayer---这个是WavPlayer和WmaPlayer的父接口,这个接口的作用通俗的说,因为MP3播放器想要播放WAV和WMA格式的音频,需要有一个接口去将两个类的方法归到一起,利用多态,实例化的时候方便很多,下面会有代码说明

                重点来了PlayerAdapter---这个就是适配器,MP3要想播放其他格式的音频就需要这个适配器

    准备工作结束现在开始实现适配器

1、首先在三个播放器父接口IMediaPlayer 添加播放的功能

    public interface IMediaPlayer {

        public void play(String platform);

    }

2、在WavPlayer和WmaPlayer的父接口ISeniorPlayer上面添加播放WAV格式和WMA格式的功能

    public interface ISeniorPlayer {

        public void playWma(String platform);

        public void playWav(String platform);

    }

3、之后在WmaPlayer和WavPlayer添加各自播放功能

    WmaPlayer:public class WmaPlayer implements ISeniorPlayer{

        @Override

        public void playWma(String platform) {

            System.out.println("***播放WMA格式音频***");

        }

        @Override

        public void playWav(String platform) {

            //这个不用处理,因为得重写父接口的方法

        }

    }

    WavPlayer:public class WavPlayer implements ISeniorPlayer {

        @Override

        public void playWma(String platform) {

            //这个不用处理,因为得重写父接口的方法

        }

        @Override

        public void playWav(String platform) {

            System.out.println("***播放WAV格式音频***");

        }

    }

4、因为MP3Player要实现播放多种格式的音频,所以它放到最后处理,先来处理适配器PlayerAdapter

    public class PlayerAdapter implements IMediaPlayer{

        public ISeniorPlayer seniorPlayer;

        public PlayerAdapter(String platform) {

            //可以根据不同的参数实例化不同的对象,避免实例化不需要的对象占用内存

          if("wav".equalsIgnoreCase(platform)) {

            //利用多态实例化对象

            seniorPlayer =  new WavPlayer();

        }else if("wma".equalsIgnoreCase(platform)) {

            //利用多态实例化对象

             seniorPlayer = new WmaPlayer();

        }

    }

    @Override

    public void play(String platform) {

        if("wav".equalsIgnoreCase(platform)) {

            seniorPlayer.playWav(platform);

        }else if("wma".equalsIgnoreCase(platform)) {

            seniorPlayer.playWma(platform);

        }

    }

}

解释一下上面代码,前面的有参构造就是利用了多态巧妙的实例化对象,如果传进来的参数是WAM就是实例化WmaPlayer如果是WAV就实例化WavPlayer,不会再实例化不需要的对象了

后面重写的play()方法就是根据传进的参数不同,调用不同的播放器,整体来说,这个适配器现在有播放WAM和WAV音频的功能,现在只要在MP3Player中处理这个适配器,MP3就可以实现播放WAM和WAV音频的功能了,下面来看看MP3Player是怎么处理的。

5、MP3Player 

    public class Mp3Player implements IMediaPlayer {

        public PlayerAdapter playerAdapter;

        @Override

        public void play(String platform) {

            if("mp3".equalsIgnoreCase(platform)) {

                System.out.println("***播放MP3***");

            }else if("wav".equalsIgnoreCase(platform)||"wma".equalsIgnoreCase(platform)) {

                //实例化PlayerAdapter适配器对象之后会在PlayerAdapter中根据传进来的参数实例化不同的对象(WavPlayer或者WmaPlayer)

                playerAdapter = new PlayerAdapter(platform);

                playerAdapter.play(platform);

            }

        }

    }

很简单,就是实例化适配器的对象,之后对象调用构造器的方法。

目前为止一个简单的适配器模式实现的MP3播放WAV和WAM格式的音频觉得功能就完成了,现在测试一下吧

    public class Test {

        public static void main(String[] args) {

           Mp3Player mp3Player = new Mp3Player();

           mp3Player.play("mp3");

           mp3Player.play("wav");

           mp3Player.play("wma");

        }

    }

    结果:***播放MP3***

                ***播放WAV格式音频***

                ***播放WMA格式音频***

结束啦

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。