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格式音频***

结束啦

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341