`
hulianwang2014
  • 浏览: 691299 次
文章分类
社区版块
存档分类
最新评论
  • bcworld: 排版成这样,一点看的欲望都没有了
    jfinal

适配器模式(Adapter Pattern)

 
阅读更多

转换一个存在的接口到一个新的接口,以完成不相关的类的兼容性和重用性,这种模式叫做适配器模式。这个模式也被称为封装(wrapper)模式,适配器模式是属于结构设计模式之一。

适用场合和优势:

  1. 尝试去匹配一个接口(WindowAdapter等)
  2. 使不相关的类工作在一起
  3. 多兼容性融合
  4. 提高类的透明性
  5. 制作可插入的套件(pluggable kit)
  6. 委托对象
  7. 更高级类的重用
相关的代理(proxy)模式, 提供了作为它的客体的相同接口,而一个适配器模式提供了一个不同的接口来适配这个对象;装饰模式, 它关注于为对象添加新功能,而一个适配器模式协调两个不同的对象;桥接模式,它尝试着从它的实现和生产一个独立且不同的对象中分离出一个接口,而一个适配器则尝试着去改变和协调一个对象的接口。
适配器模式可以使用继承或是组合方式实现,实现方法不同,但是目的和解决方案是一样的。
经典的UML类图如下:

根据一个具体的实例来阐明什么是工厂模式。我们有一个接口MediaPlayer和一个具体的音频播放器实现 MediaPlayer接口。AudioPlayer默认情况下能够播放mp3格式的音频文件。 我们也有另一个AdavnacedMediaPlayer接口和它的实现类AdvancedMediaPlayer,这个类能够播放vlc和mp4格式的音频文件。现在,我们想AudioPlayer也能够播放其它格式(mp4和vlc)文件。为了达到这个目的, 我需要创建一个适配器类MediaPlayer来实现MediaPlayer接口,组合使用AdvancedMediaPlayer类以达到能够播放需要的格式的目的。AudioPlayer使用了适配器类MediaAdapter传入给它音频类型,不需要知道事实上那个类能够播放这个格式的文件。最后,使用AdapterPatternDemo测试这个设计模式。UML类图如下所示:

接口MediaPlayer, AdvanceAudioPlayer的定义。

public interface MediaPlayer {
    public void play(String audioType, String fileName) ;
}

public interface AdvancedMediaPlayer {
    public void playVlc(String fileName);
    public void playMp4(String fileName);
}

AudioPlayer的具体实现。

public class AudioPlayer implements MediaPlayer {
    MediaAdapter mediaAdapter;

    @Override
    public void play(String audioType, String fileName) {

        //inbuilt support to play mp3 music files
        if(audioType.equalsIgnoreCase("mp3")){
            System.out.println("Playing mp3 file. Name: "+ fileName);
        }
        //mediaAdapter is providing support to play other file formats
        else if(audioType.equalsIgnoreCase("vlc")
                || audioType.equalsIgnoreCase("mp4")){
            mediaAdapter = new MediaAdapter(audioType);
            mediaAdapter.play(audioType, fileName);
        }
        else{
            System.out.println("Invalid media. "+
                    audioType + " format not supported");
        }
    }
}

高级音频播放器的具体实现。

public class Mp4Player implements AdvancedMediaPlayer{
    @Override
    public void playVlc(String fileName) {
        //do nothing
    }

    @Override
    public void playMp4(String fileName) {
        System.out.println("Playing mp4 file. Name: "+ fileName);
    }
}

public class VlcPlayer implements AdvancedMediaPlayer {

    @Override
    public void playVlc(String fileName) {
        System.out.println("Playing vlc file. Name: "+ fileName);
    }

    @Override
    public void playMp4(String fileName) {
        //do nothing
    }

}
定义是一个适配器,适配高级音频播放器功能。

public class MediaAdapter  implements MediaPlayer {
    AdvancedMediaPlayer advancedMusicPlayer;

    public MediaAdapter(String audioType){
        if(audioType.equalsIgnoreCase("vlc") ){
            advancedMusicPlayer = new VlcPlayer();
        } else if (audioType.equalsIgnoreCase("mp4")){
            advancedMusicPlayer = new Mp4Player();
        }
    }

    @Override
    public void play(String audioType, String fileName) {
        if(audioType.equalsIgnoreCase("vlc")){
            advancedMusicPlayer.playVlc(fileName);
        }else if(audioType.equalsIgnoreCase("mp4")){
            advancedMusicPlayer.playMp4(fileName);
        }
    }
}

正如AudioPlayer代码展示的,只需要调用AudioPlayer就能够播放高级音频格式的视频文件。具体测试代码如下:

public class AdapterPatternDemo {
    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");
    }
}

运行结果:

Playing mp3 file. Name: beyond the horizon.mp3
Playing mp4 file. Name: alone.mp4
Playing vlc file. Name: far far away.vlc
Invalid media. avi format not supported

分享到:
评论

相关推荐

    设计模式之适配器模式(Adapter Pattern)

    设计模式之适配器模式(Adapter Pattern) 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

    Head First 设计模式 (七) 适配器模式(Adapter pattern) C++实现

    Head First 设计模式 (七) 适配器模式(Adapter pattern) C++实现

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    8、适配器模式ADAPTER PATTERN 9、模板方法模式TEMPLATE METHOD PATTERN 10、建造者模式BUILDER PATTERN 11、桥梁模式BRIDGE PATTERN 12、命令模式COMMAND PATTERN 13、装饰模式DECORATOR PATTERN 14、迭代器模式...

    适配器模式(Adapter Pattern)原理图

    - **Adapter(适配器)**:这是实现目标接口并含有适配者实例的类。适配器的作用是将适配者的接口转换为目标接口。 2. **工作原理**: - 适配器模式通过引入一个中间层即适配器来解决两个不同接口之间的兼容性问题...

    设计模式:结构型-适配器模式

    适配器模式(Adapter Pattern) 是作为两个不兼容接口之间的桥梁, 这种类型的设计模式属于结构型模式。 一些书籍也称适配器模式为缺省适配器模式(Default Adapter Pattern) 。 适配器模式主要分 为三类: 类...

    设计模式 之 “适配器模式[Adapter Pattern]”

    NULL 博文链接:https://lym6520.iteye.com/blog/713094

    适配器模式

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

    .NET设计模式(8):适配器模式(AdapterPattern)

    .NET设计模式(8):适配器模式(AdapterPattern)

    java设计模式之适配器模式

    java设计模式之适配器模式,希望对大家有所帮助。

    设计模式_适配器模式.zip

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

    设计模式之适配器模式C++实现

    用c++方法实现AdapterPattern模式

    Python设计模式之适配器模式原理与用法详解

    本文实例讲述了Python设计模式之...适配器模式(Adapter Pattern):将一个类的接口转换成为客户希望的另外一个接口.Adapter Pattern使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 应用场景:系统数据和

    C#版 24种设计模式

    适配器模式(Adapter Pattern) 提供者模式(Provider Pattern) 外观模式(Facade Pattern) 享元模式(Flyweight Pattern) 原型模式(Prototype Pattern) 责任链模式(Chain of Responsibility Pattern) 中介者模式...

    24种设计模式与6大设计原则

    适配器模式[ADAPTER PATTERN] 模板方法模式[TEMPLATE METHOD PATTERN] 建造者模式[BUILDER PATTERN] 策略模式 代理模式 单例模式 多例模式 工厂方法模式 抽象工厂模式 门面模式 适配器模式 模板方法模式 建造者模式...

    用Java实现23种设计模式

    适配器模式(Adapter Pattern) 桥接模式(Bridge Pattern) 过滤器模式(Filter、Criteria Pattern) 组合模式(Composite Pattern) 装饰器模式(Decorator Pattern) 外观模式(Facade Pattern) 享元模式...

    C#设计模式_设计模式_C#_

    适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式...

    Java设计模式,并加上个人理解

    7. 适配器模式 (Adapter Pattern) 8. 模板方法模式 (Template Pattern) 9. 建造者模式 (Builder Pattern) 10. 原型模式 (Prototype Pattern) 11. 组合模式 (Composite Pattern) 12. 装饰者模式 ...

    C#设计模式(23种设计模式)

    适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. ...

    设计模式PPT

     适配器模式(Adapter Pattern)  桥接模式(Bridge Pattern)  组合模式(Composite Pattern)  装饰者模式(Decorator Pattern)  外观模式(Facade Pattern)  享元模式(Flyweight Pattern)  ...

Global site tag (gtag.js) - Google Analytics